一、中间件的概念
中间件是Django请求与响应处理的钩子框架,是一个轻量级的插件系统。中间件用于在视图函数执行之前和执行之后做一些预处理和后处理操作,功能类似装饰器。它的表现形式是一个Python类。简而言之就是处理请求和响应。
二、中间件在django中的应用
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件。
每一个中间件中都有继承
from django.utils.deprecation import MiddlewareMixin
自MiddlewareMixin类的五个方法方法,一般常用的就是对处理请求的process_request(self, request)和处理响应的process_response(self, request, response)这两个方法就行重载,在自定义中间件后,还要在settings.pyd的MIDDLEWARE_CLASSES中进行注册,要注意的是注册的位置会影响其执行的执行的顺序,中间件执行的
顺序见上图的箭头顺序。
process_request(self,request) :
执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
process_view(self, request, callback, callback_args, callback_kwargs):
调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
process_template_response(self,request,response):
在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
process_exception(self, request, exception)
当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
process_response(self, request, response)
所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
三、django中间件源码示例
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.get_user(request)
return request._cached_user
class AuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
assert hasattr(request, 'session'), (
"The Django authentication middleware requires session middleware "
"to be installed. Edit your MIDDLEWARE%s setting to insert "
"'django.contrib.sessions.middleware.SessionMiddleware' before "
"'django.contrib.auth.middleware.AuthenticationMiddleware'."
) % ("_CLASSES" if settings.MIDDLEWARE is None else "")
request.user = SimpleLazyObject(lambda: get_user(request))
上面这个用户验证的中间件只重载了处理请求的方法,所以我们自定义中间件时要结合自己的需要重载。
四、自定义中间件流程
第一步:在主目录下创建存放自定义中间价类的模块文件middlewares.py
第二步:编写自定义中间件类
第一种方式:
from django.utils.deprecation import MiddlewareMixin
from django.http.response import HttpResponse
class UserMiddlerware(MiddlewareMixin):
def process_request(self, request):
print("自定义process_request")
return None
def process_view(self, request, callback, callback_args, callback_kwargs):
return None
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
return response
def process_exception(self, request, exception):
return HttpResponse(exception)
第二种方式:
from User.models import User
class UserMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# request到达view之前执行代码
username = request.session.get("username", "未登录")
user = User.objects.filter(username=username).first()
if user:
setattr(request, "myuser", user.username)
else:
setattr(request, "myuser", "未登录")
response = self.get_response(request)
# response到达用户浏览器之前执行的代码
return response
建议:使用第一种方式编写自定义中间件,代码的执行流程比较清晰。
第三步:注册中间件
注意:如果你的process_request依赖其他中间价的process_request,必须要放在所依赖的中间件的后面。
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',
'blog.middlewares.UserMiddleware'
]
blog是项目名,先找到文件所在的位置,把自定义的中间件的类添加到MIDLEWARE的列表当中。