引子-Django的生命周期
在学习中间介之前,我们先来回顾一下Django的生命周期:用户发起请求,请求会被发送到urlconf中的url,然后会指向对应的views函数进行处理,views函数处理完成后,用模板渲染好html,然后返回给用户的浏览器。
加上中间介的流程如下:
在Django中的setttings文件有配置middleware
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
执行顺序从上到下。
自定义中间介
1、自定义中间介
新建一个名为middle的包,下面新建文件md.py,
内容如下:
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
print "MD1 process_request"
def process_response(self,request,response):
print "MD1 process_response"
return response
class MD2(MiddlewareMixin):
def process_request(self,request):
print "MD2 process_request"
def process_response(self,request,response):
print "MD2 process_response"
print response
return response
2、setttings文件配置
MIDDLEWARE新增中间介配置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'middle.md1.MD1',
'middle.md1.MD2',
]
3、视图函数
views.py
def md(request):
print "views function"
return HttpResponse('execute view function')
4、urls.py文件
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
url(r'^mf/', views.mf),
url(r'^fm/', views.fm),
url(r'^myform/', views.myform),
url(r'md',views.md),
]
5、访问URL
浏览器返回视图函数的内容:
后台执行:
中间介依次执行,
MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response
中间介的response值为视图函数的返回值。
class MD1(MiddlewareMixin): def process_request(self,request): print "MD1 process_request"
#process_request函数有返回值时,会直接返回给用户,而不往下执行。 return HttpResponse('MD1 process_request') def process_response(self,request,response): print "MD1 process_response" return response
执行结果为:
多个middleware的整体执行流程如下:
MiddlewareMixin函数
源码
class MiddlewareMixin(object):
#构造函数执行父类的构造函数
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__()
def __call__(self, request):
response = None
#如果当前中间介有process_request方法,则执行
if hasattr(self, 'process_request'):
response = self.process_request(request)
#如果当前中间介没有process_request方法,则执行下一个中间介的__call__(),依次循环执行下去
if not response:
response = self.get_response(request)
#执行当前中间介的process_reponse方法
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
7、8、9版本里面process_request和process_response方法都是必须写的,10版本以后可以不写,但是为了过渡,最好写上。
每个中间介,可能只有process_request,也可能只有process_response方法。
总结
中间介整体执行流程
中间介应用场景
对于所有的用户统一的请求都需要处理,这时就需要中间介可以搞定,如果是部分用户请求,可以用装饰器进行处理。
csrf是通过判断request的header里面是否有csrf参数。
最常用的方法
process_request
因为process_request方法可以在用户请求时,做统一的操作非常方便、灵活,比如设置白名单。