Django中间件
在django中叫中间件,在其他web框架中,有的叫管道,httphandle,本次主要介绍定义中间件方法、中间件中的方法、中间件的作用等。
自定义中间件
1、中间件为:函数
定义一个中间件工厂函数,然后返回一个可以别调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware
例如,在users应用中新建一个middleware.py文件,
def my_middleware(get_response): print('init 被调用') def middleware(request): print('before request 被调用') response = get_response(request) print('after response 被调用') return response return middleware
定义好中间件后,需要在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', 'users.middleware.my_middleware', # 添加中间件 ]
定义一个视图进行测试
def demo_view(request): print('view 视图被调用') return HttpResponse('OK')
执行结果
注意:Django运行在调试模式下,中间件init部分有可能被调用两次。
2、中间件为:类
我们可以自己写一个类,作为中间件,但是必须继承MiddlewareMixin, 所以需要导入:from django.utils.deprecation import MiddlewareMixin
中间件合法的5种方法:
process_request(self, request): # 请求时过滤
#request:请求信息, callback:函数名, callback_args:函数可变参数(元组调用), callback_kwargs:函数关键字参数(字典调用) process_view(self, request, callback, callback_args, callback_kwargs) # 视图函数过滤
process_exception(self, request, exception) # views内代码异常执行,exception:异常信息
process_template_response(self, request, exception) # 如果views返回的对象有render方法 则该函数被执行
process_response(self, request, response): # 返回时过滤
中间件的各方法执行顺序
自定义中间件步骤:
【1】在App目录下创建名为middlewares的包
【2】在包中创建自己的中间件类文件
verifycodeMiddleware.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
class VerifycodeMiddleware(MiddlewareMixin):
def process_request(self, request):
print("***************", request.path)
if request.path == "/login/" and request.method == "POST":
# 判断验证码
verifycode = request.POST.get("verifycode")
if not verifycode.upper() == request.session.get("verifycode").upper():
return redirect("/login/")
【3】在settings.py文件中配阿置MIDDLEWARE
中间件的使用场景
1.做IP限制
放在中间件类的列表中,阻止某些ip访问;
2.URL访问过滤
如果用户访问的是logo视图(放过)
如果访问其他视图,需要检测是否已经有session,已经有了放行,如果没有返回login,这样就省的在多个视图函数上写装饰器了!
3.缓存
客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层执行视图函数
参考:
https://blog.csdn.net/qq_31479309/article/details/80080851
https://segmentfault.com/a/1190000015607283
https://www.cnblogs.com/zhaof/p/6281541.html