Django进阶篇【1】
注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充!
首先我们一起了解下Django整个请求生命周期:
Django 请求流程,生命周期:

路由部分
代码如下:
myWeb中url.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #url(r'^user_list/(\d+)/(\d+)$', views.user_list),
    #url(r'^user_list/(?P<v1>(\d+))/(?P<v2>(\d+))$', views.user_list),
    #url(r'^$', views.index),
    url(r'^app01/',include("app01.urls")),
]
app01中views.py
from django.shortcuts import HttpResponse
def index(request):
	return HttpResponse('index')
def user_list(request,v1,v2):
	print v1,v2
	return HttpResponse(v1+v2)
app01 中url.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^index/$', views.index),
]
访问方法:
http://127.0.0.1:9001/app01/index
可知:这样定义的好处是,在多个app的场合下可以很好的分离出来!
二、中间件
自定义中间件:

思路分析:
1、获取请求
2、去settings.py MIDDLEWARE_CLASSES 中注册
3、注册好后,Django会自动去setttings里找 MIDDLEWARE_CLASSES
4、遍历注册中的类:
for 类 in MIDDLEWARE_CLASSES:
	obj = 类()
	if obj里有process_request方法:
		process_request_list.append(obj.process_request)
for i in process_request_list:
	i()
for i in process_view_list:
	i()
views.py 中函数:
for i in process_response_list:
	i()
	...
分析源码截图:

开始自定义中间件,目录结构如下:

middle_ware.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'Allen'
class mid(object):
	def process_request(self,request):
		print "mid.process_request"
	def process_view(self, request, callback, callback_args, callback_kwargs):
		print "mid.process_view"
	def process_response(self, request, response):
		print "mid.process_response"
		return response
class ddd(object):
	def process_request(self,request):
		print "ddd.process_request"
	def process_view(self, request, callback, callback_args, callback_kwargs):
		print "ddd.process_view"
	def process_response(self, request, response):
		print "ddd.process_response"
		return response
views.py
from django.shortcuts import render
# Create your views here.
from django.shortcuts import HttpResponse
def index(request):
	print "index"
	return HttpResponse('index')
setting.py 进行注册:

MIDDLEWARE_CLASSES = [
	  #....
    'middleware.middle_ware.mid',   #注册
    'middleware.middle_ware.ddd',   #注册
]
访问:
http://127.0.0.1:9001/app01/index
执行结果:
mid.process_request
ddd.process_request
mid.process_view
ddd.process_view
index
ddd.process_response
mid.process_response
cookie和session
cookie 就是一段字符串,保存在本地
session 保存在服务器端

操作Cookie
获取cookie:request.COOKIES[key]
设置cookie:response.set_cookie(key,value)
由于cookie保存在客户端的电脑上,所以,jquery也可以操作cookie。
<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });
操作Session
获取session:request.session[key]
设置session:reqeust.session[key] = value
删除session:del request[key]
request.session.set_expiry(value)
如果value是个整数,session会在些秒数后失效。
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略。
session 设置失效时间:
setting.py
SESSION_COOKIE_AGE = 1209600 (默认是这么多秒)
我们可以设置1分钟,或者更小,如10秒
SESSION_EXPIRE_AT_BROWSER_CLOSE 设置false (只要浏览器关闭,session自动过期)
示例如下:
views.py
def login(request):
	print request.method
	if request.method == "POST":
		user = request.POST.get('user')
		pwd = request.POST.get('pwd')
		if user == "test" and pwd == '123':
			request.session['login'] = True
			return redirect('/app01/data/')
	return render(request,'login.html')
def data(request):
	is_login = request.session.get('login',False)
	if is_login:
		return HttpResponse('login success!')
	else:
		return redirect('/app01/login/')
app01下的urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^data/', views.data),
    url(r'^login/', views.login),
]
setting.py
注释下面的内容:
MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware', #需要注释,否则报错
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    #'middleware.middle_ware.mid', #这里是上面的项目,为了效果,我们注释下面两行
    #'middleware.middle_ware.ddd',
]
访问:http://127.0.0.1:9001/app01/login/ 用户名和密码分别为:test 123
Django下Form表单
django中的Form一般有两种功能:
1、输入html
2、验证用户输入
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
from django import forms
from django.core.exceptions import ValidationError
def mobile_validate(value):
    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
    if not mobile_re.match(value):
        raise ValidationError('手机号码格式错误')
class PublishForm(forms.Form):
    user_type_choice = (
        (0, u'普通用户'),
        (1, u'高级用户'),
    )
    user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
                                                                  attrs={'class': "form-control"}))
    title = forms.CharField(max_length=20,
                            min_length=5,
                            error_messages={'required': u'标题不能为空',
                                            'min_length': u'标题最少为5个字符',
                                            'max_length': u'标题最多为20个字符'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                          'placeholder': u'标题5-20个字符'}))
    memo = forms.CharField(required=False,
                           max_length=256,
                           widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}))
    phone = forms.CharField(validators=[mobile_validate, ],
                            error_messages={'required': u'手机不能为空'},
                            widget=forms.TextInput(attrs={'class': "form-control",
                                                          'placeholder': u'手机号码'}))
    email = forms.EmailField(required=False,
                            error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
                            widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
示例如下:
app01中的urls.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/app01/user_list/" method="post">
        <p>用户:{{ obj.user }}<span>{{ errors.user }}</span></p>
        <p>性别:{{ obj.sex }}<span>{{ errors.sex }}</span></p>
        <p>邮箱:{{ obj.email }}<span>{{ errors.email }}</span></p>
        <p>手机{{ obj.mobile }}<span>{{ errors.mobile }}</span></p>
        <input type="submit" value="submit"/>
    </form>
</body>
</html>
views.py
from django import forms
class UserInfo(forms.Form):
	user = forms.CharField()
	sex = forms.CharField()
	mobile = forms.EmailField()
	email = forms.EmailField()
def user_list(request):
	obj = UserInfo()
	if request.method == "POST":
		user_input_obj = UserInfo(request.POST)
		if user_input_obj.is_valid():
			data = user_input_obj.clean()  #获取用户输入的所有内容
			print data
		else:
			error_msg = user_input_obj.errors
			return render(request,'user_list.html',{'obj':user_input_obj,'errors':error_msg})
	return render(request,'user_list.html',{'obj':obj})
templates中的user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/app01/user_list/" method="post">
        <p>用户:{{ obj.user }}<span>{{ errors.user }}</span></p>
        <p>性别:{{ obj.sex }}<span>{{ errors.sex }}</span></p>
        <p>邮箱:{{ obj.email }}<span>{{ errors.email }}</span></p>
        <p>手机{{ obj.mobile }}<span>{{ errors.mobile }}</span></p>
        <input type="submit" value="submit"/>
    </form>
</body>
</html>
访问:http://127.0.0.1:9001/app01/user_list/
结果截图:from_1.png
提交结果截图2:from_2.png
提交结果截图如下:


ajax
(WUSIR)
function AjaxSubmitSet(){
            var array_users= [
                {'username': 'alex', 'age': 18},
                {'username': 'rain', 'age': 16},
                {'username': 'eric', 'age': 17}
            ];
            $.ajax({
                url: "/ajax_data_set/",
                type: 'POST',
                tradition: true,
                data: {data: JSON.stringify(array_users)},
                success: function(arg){
                    // json.loads
                    var callback_dict = $.parseJSON(arg);
                    if(callback_dict.status){
                        alert('成功');
                    }else{
                        alert(callback_dict.error);
                    }
                }
            });
        }
import json
def ajax_data_set(request):
    ret = {'status': True, 'error':""}
    try:
        print request.POS
    except Exception,e:
        ret['status'] = False
        ret['error'] = str(e)
    return HttpResponse(json.dumps(ret))
更多链接:http://www.cnblogs.com/wupeiqi/articles/5246483.html
Django进阶篇【1】的更多相关文章
- 02:Django进阶篇
		
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
 - django 进阶篇
		
models(模型) 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetLi ...
 - python Django 进阶篇
		
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
 - Python之路【第十七篇】Django进阶篇
		
规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...
 - django进阶篇
		
原文连接:http://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创 ...
 - Python学习-day20 django进阶篇
		
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
 - Django进阶篇(二)
		
中间件 解析 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后, django会根据自己的规则在合适的时机执行中间件中相应的方法. 在dja ...
 - Python之路【第十六篇续】Django进阶篇
		
Django请求生命周期 首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端 路由系统 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规 ...
 - Django进阶篇(一)
		
Form django中的Form一般有两种功能: 1.输入html 2.验证用户输入 最简易的form验证: <!DOCTYPE html> <html lang="en ...
 
随机推荐
- [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
			
这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...
 - java初步—参数的值传递
			
校招季,本人匆匆忙忙地参加各种宣讲会,几次笔试下来都遇到同一个题目,而且全都错在同一想法上,方知自己的基础实在不太牢固,因此特别写在博客上提醒自己要脚踏实地地学习!不多说了,题目如下: public ...
 - [js高手之路]Vue2.0基于vue-cli+webpack Vuex用法详解
			
在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传递数据或组件的状态(这里将数 ...
 - NHibernate教程(9)一1对n关联映射
			
本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...
 - RobotFramework自动化测试框架-移动手机自动化测试Input Text和Click Button关键字的使用
			
Input Text和Click Button Input Text 关键字一般用来给输入框进行输入操作,该关键字接收两个参数[ locator | text ]. 示例1:启动安卓手机上一个APP的 ...
 - JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象
			
前 言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...
 - 201521123066 《Java程序设计》 第二周学习总结
			
1.本周学习总结,记录本周学习中的重点 关于String类:String类的对象创建之后不能再进行修改:当大量拼接字符串是,使用StringBuilder而 不使用String:检测字符串是否相等时, ...
 - Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解
			
快速了解Log4J Log4J的三个组件: Logger:日志记录器,负责收集处理日志记录 (如何处理日志) Appender:日志输出目的地,负责日志的输出 (输出到什么 地方) Layo ...
 - foreach嵌套循环
			
最近几天被这个嵌套搞晕了,还好经过几天的努力终于解决了,特记录下,因为要传两个List集合到jsp页面,还都是在一起输出,发现不能把两个集合放在一个foreach,所以就写了两个foreach来接受, ...
 - JDBC在javaweb中的应用之分页数据查询
			
分页查询 分页查询是java web开发中经常使用到的技术.在数据库中数据量非常大的情况下,不适合将所有的数据全部显示到一个页面中,同时为了节约程序以及数据库的资源,就需要对数据进行分页查询操作. 通 ...