django中间件
官方说法:中间件是一个用来处理django的请求和响应的框架级别的钩子。说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,他本质上就是一个自定义类,类中定义了几个方法,django框架会在请求的特定的时间去执行这些方法。
django中间件类似于django的门户、所有的请求来和响应走都必须经过中间件。
django默认自带七个中间件每个中间件都有各自负责的功能、我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下面的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',
]
django中间件的使用场景:只要是与全局相关的功能都可以在中间件中编写。
eg:全局用户身份校验、全局用户黑名单校验、全局用户访问频率校验。
自定义中间件
django支持自定义中间件可以有5个方法。
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
基本使用
- 创建一个任意名称的文件夹
- 在该文件夹内创建一个任意名称的py文件
- 在该py文件内编写中间件类
- 配置文件中注册
# 步骤二创建的py文件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render
class MyMdd1(MiddlewareMixin):
def process_request(self, request):
print('from MyMdd1 process_request')
def process_response(self, request, response):
print('from MyMdd1 process_response')
return response # response就是视图函数返回给客户端的数据
# settings.py
MIDDLEWARE = [
# 注册自定义中间件
'app01.mymiddleware.mymdd.MyMdd1',
'app01.mymiddleware.mymdd.MyMdd2',
]
需要掌握的方法
1.process_request
def process_request(self, request):
print('from MyMdd1 process_request')
return HttpResponse('from MyMdd1 process_request')
1.请求来的时候会按照配置文件中注册了的中间件从上往下依次执行每一个中间件里面process_request方法、如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象,那么请求不再继续往后执行原路返回相应的数据
2.process_response
def process_response(self, request, response):
print('from MyMdd1 process_response')
return response # response就是视图函数返回给客户端的数据
1.响应走的时候会按照配置文件中注册了的中间件从下往上依次执行每一个中间件里process_response方法、如果没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据,而不再是视图函数想要返回给客户端的数据
注意:
如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)。
需要了解的方法
1.process_view
def process_view(self,request,view_func, view_args, view_kwargs):
# print(view_func) # 即将要执行的视图函数名
# print(,view_args) # 传给视图函数的位置参数
# print(view_kwargs) # 传给视图函数的关键字参数
print('from MyMdd2 process_view')
当路由匹配成功之后执行视图函数之前自动从上往下执行配置文件中注册了的中间件里面的process_view方法
2.process_exception
def process_exception(self,request,exception):
print(exception)
print('from MyMdd2 process_exception')
当视图函数执行过程中报错并在返回响应的时候自动从下往上执行配置文件中注册了的中间件里面的process_exception
3.processtemplate_response
def process_template_response(self,request,response):
print('from MyMdd2 process_template_response')
return response
当视图函数执行完毕之后返回的对象中含有render属性对应render函数,则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
标签:框架,process,中间件,request,django,response,view
From: https://www.cnblogs.com/wxlxl/p/17026093.html