37 django中间件
django中间件是django的门户
请求来的时候需要先经过中间件才能到达真正的django后端
响应走的时候最后也需要经过中间件才能发送出去
当我们需要给web后端添加一些全局相关的功能时可以使用中间件
1.校验每个用户的访问频率
2.校验每个用户的登录状态
3.用户黑名单、白名单
4.用户权限
1 django自带七个中间件
django.middleware.security.SecurityMiddleware 相当于 from django.middleware.security import SecurityMiddleware
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', ]
CommonMiddleware中间件控制了是否重定向到带/的地址
2 每个中间件基本都有process_request和process_response方法
class SessionMiddleware(MiddlewareMixin): def process_request(self, request): session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME) request.session = self.SessionStore(session_key) def process_response(self, request, response): return response class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): return self._accept(request) def process_response(self, request, response): return response class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request): request.user = SimpleLazyObject(lambda: get_user(request))
3.django支持自定义中间件
有五个可以自定义的方法:
1.必须掌握 process_request process_response 2.了解即可 process_view process_template_response process_exception
4 如何自定义中间件
1.在项目名或者应用名下创建一个任意名称的文件夹 2.在该文件夹内创建一个任意名称的py文件 3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin) 然后在这个类里面就可以自定义五个方法了 (这五个方法并不是全部都需要书写,用几个写几个) 4.需要将类的路径以字符串的形式注册到配置文件中才能生效
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', '你自己写的中间件的路径2', '你自己写的中间件的路径3', ]
4.1 process_request
process_request(self,request)
1.当请求来的时候会从上往下依次执行每一个中间件里面的该方法
如果没有则直接下一个
2.当该方法返回了HttpResponse对象 那么请求不再继续往后执行
而是直接原路返回
process_request方法就是用来做全局相关的所有限制功能
自定义中间件:
1、在app01下创建mymiddle文件夹 2、在mymiddle下创建mydd.py文件 3、书写类(这个类必须继承MiddlewareMixin)
from django.utils.deprecation import MiddlewareMixin class MyMiddleware1(MiddlewareMixin): def process_request(self, request): print('中间件1里的process_request') class MyMiddleware2(MiddlewareMixin): def process_request(self, request): print('中间件2里的process_request')
views.py
def my_dd(request): print('view里的') return HttpResponse('hello')
4.2 process_response
process_response(self,request,response) 1.当响应返回的时候会从下往上依次执行每一个中间件里面的该方法 如果没有则直接下一个 该方法默认要返回response,你也可以返回自己的 2.该方法返回什么浏览器就会接收到什么(也就意味着我们可以中途拦截待返回的数据做其他处理)
该方法有两个额外的参数request,response
class MyMiddleware1(MiddlewareMixin): def process_request(self, request): print('中间件1里的process_request') # return HttpResponse('666') def process_response(self, request, response): print('中间件1里的process_response') return response class MyMiddleware2(MiddlewareMixin): def process_request(self, request): print('中间件2里的process_request') def process_response(self, request, response): print('中间件2里的process_response') return response
研究如果在第一个process_request方法就已经返回了HttpResponse对象,那么响应走的时候是经过所有的中间件里面的process_response还是有其他情况?
答:会直接走同级别的process_reponse返回
4.3 process_view
process_view(self, request, view_func, view_args, view_kwargs)
该方法有四个参数
request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。
路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法
顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
4.4 process_template_response(用的比较少)
process_template_response(self, request, response)
返回的HttpResponse对象有render属性的时候才会触发
顺序是按照配置文件中注册了的中间件从下往上依次经过
4.5 process_exception
process_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
当视图函数中出现异常的情况下触发
顺序是按照配置文件中注册了的中间件从下往上依次经过