共计 1555 个字符,预计需要花费 4 分钟才能阅读完成。
一、说明
中间件是一个用来处理 Django 的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变 Django 的输入和输出。每个中间件组件都负责做一些特定的功能。可以介入 Django 的请求和响应
二、本质
一个 Python 类
三、中间件应用场景
-
白名单 / 黑名单
通过访问者用户或者 IP 优先通过或者拒绝一些用户的访问
-
URL 访问过滤
如果用户访问的是 lsogin 视图(s 放过)
如果访问其他视图(需要检测是不是有 session 已 dzfr 经有了放行,没有返回 login),这样就省得在 多个视图函数上写装饰器了
-
缓存
客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层 执行视图函数
四、方法
-
__init__
不需要传参数,服务器响应第一个请求的时候自动调用,用于确定是否启用该中间件
-
process_request(self,request)
在执行视图之前被调用(分配 url 匹配视图之前),每个请求上都会调用,返回 None 或者 HttpResponse 对象
返回值是 None 的话,按正常流程继续走,交给下一个中间件处理,如果是 HttpResponse 对象,Django 将不执行视图函数,而将相应对象返回给浏览器
-
process_view(self,request,view_func,view_args,view_kwargs)
调用视图之前执行,每个请求都会调用,返回 None 或者 HttpResponse 对象
参数说明
- request 是 HttpRequest 对象。
- view_func 是 Django 即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
- view_args 是将传递给视图的位置参数的列表
- view_kwargs 是将传递给视图的关键字参数的字典
- view_args 和 view_kwargs 都不包含第一个视图参数(request)
-
process_template_response(self,request,response)
在视图刚好执行完后调用,每个请求都会调用,返回 None 或者 HttpResponse 对象
-
process_response(self,request,response)
所有响应返回浏览器之前调用,每个请求都会调用,返回 HttpResponse 对象
-
process_exception(self,request,exception)
当视图抛出异常时调用,返回 HttpResponse 对象
五、图解
六、自定义中间件
-
App 同级 -> 创建工程目录 middleware
|-App
|-middleware
|–myMiddle.py
|-project -
在 middleware 里 创建一个 python 文件 myMiddle.py
from django.utils.deprecation import MiddlewareMixin class MyMiddle(MiddlewareMixin): def process_request(self, request): print("get 参数为:", request.GET.get("arg")) print("请求方法", request.method) #HTTP_USER_AGENT if request.META['REMOTE_ADDR'] == '127.0.0.1': return HttpResponse('抱歉 您不能进行访问') def process_exception(self,request,exception): print(str(exception)) return redirect('/') # 如果出现异常去首页
-
使用自定义中间件
配置 settings.py 文件
MIDDLEWARE 中添加
'middleware.myMiddle.MyMiddle'