标签:process 中间件 self request response django middleware
一、中间件的概念
中间件是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的列表当中。
标签:process,中间件,self,request,response,django,middleware 来源: https://www.cnblogs.com/loveprogramme/p/12469721.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。