二、自定义django中间件
自定义中间件
'''
1.在项目名或者应用名下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin)
然后在这个类里面就可以自定义五个方法了
(这五个方法并不是全部都需要书写,用几个写几个)
4.需要将类的路径以字符串的形式注册到settings.py配置文件中才能生效
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',
...
]
'''
django中间件规律:
- 如果在经过中间件的时候,其中一个中间件中的process_request方法内返回了HttpResponse对象,那么请求响应直接终止
- 并且在该中间件中继续执行process_response方法,如果此刻process_response方法也返回了HttpResponse对象
- 那么以process_response作为最终结果,然后将最终数据返回给前端页面
flask中间件规律:
- 只要返回数据了就必须经过所有中间件里面的类似于process_response方法
process_request
from django.utils.deprecation import MiddlewareMixin
class 自定义类名(MiddlewareMixin):
def process_request(self, request):
pass
'''
详细规律:
1.请求来的时候需要经过每一个中间件里面的process_request方法
经过的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
2.如果中间件里面没有定义process_request方法,那么直接跳过执行下一个中间件
3.如果中间件中process_request方法设置了return HttpResponse对象,那么请求将不再继续往后执行,而是直接返回此刻process_request方法中的HttpResponse对象(例如:校验失败不允许访问...)
process_request方法就是用来做全局相关的所有限制功能
'''
process_response
from django.utils.deprecation import MiddlewareMixin
class 自定义类名(MiddlewareMixin):
def process_response(self, request, response):
return response
'''
详细规律:
1.响应走的时候需要结果每一个中间件里面的process_response方法
该方法有两个额外的参数request,response
2.顺序是按照配置文件中注册了的中间件从下往上依次经过
如果此刻中间件没有定义process_response方法的话,直接跳过执行下一个中间件
3.该方法必须返回一个HttpResponse对象
默认返回的就是形参response(那么浏览器会获取到后端views.py中返回的html页面)
return response
你也可以自己返回自己的(那么浏览器只会获取到proocess_response方法返回的html页面)
return HttpResponse('xxx')
'''
process_view
from django.utils.deprecation import MiddlewareMixin
class 自定义类名(MiddlewareMixin):
def process_view(self, request, view_name, *args, **kwargs):
pass
'''
详细规律:
1. **路由匹配成功之后执行视图函数之前**,会自动执行中间件里面的该放法
2. 顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
3. 具体顺序为:precess_request->路由匹配成功之后执行视图函数之前-->process_view-->precess_response
'''
process_template_response
from django.utils.deprecation import MiddlewareMixin
class 自定义类名(MiddlewareMixin):
def process_template_response(self, request, response):
return response
'''
详细规律:
1.返回的HttpResponse对象有render属性的时候才会触发,如下:
def 视图函数(request):
obj = HttpResponse('xxx')
def render():
return HttpResponse('yyy')
obj.render = render
return obj
2.顺序是按照配置文件中注册了的中间件从下往上依次经过!
3.具体顺序如下:
precess_request->
路由匹配成功之后执行视图函数之前-->
process_view-->
process_template_response-->
process_response
'''
process_exception
from django.utils.deprecation import MiddlewareMixin
class 自定义类名(MiddlewareMixin):
def process_exception(self, request, exception):
pass
'''
详细规律:
1.当视图函数中出现异常的情况下触发
def 视图函数(request):
raise 异常类名('输出信息')
2.顺序是按照配置文件中注册了的中间件从下往上依次经过
3.具体顺序如下:
precess_request->
路由匹配成功之后执行视图函数之前-->
process_view-->
views.py中视图函数报错-->
process_exception-->
process_template_response-->
process_response
参数:
exception:输出出现异常的视图函数中的报错详细
'''

浙公网安备 33010602011771号