django 中的数据流就是请求和响应, 如果将 django 比作一个工厂, 数据请求代表进货, 将数据进行加工然后再出货也就是响应, 中间的加工过程就可以用中间件来完成
含义: 处理接收的请求和发出的响应的组件, 都是由中间件来完成
本质: 是一个具有指定方法的类
函数定义中间件
文件名命名不受限, 放置的路径也不受拘束, 可以放在 django 项目下的任意位置, 必须是可导入的路径
文件中定义方法, 方法名随意 , 传入参数 get_response, 参数名不能改
首先我们先来写一个简单的中间件
- def simple_middleware(get_response):
- print('进入中间件')
- def middleware(request):
- print('处理请求前')
- response = get_response(request)
- print('处理请求后')
- return response
- return middleware
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
使用之前, 要去激活中间件
- MIDDLEWARE = [
- ...
- # 中间件函数的完整 python 路径
- 'teacher.middleware.simple_middleware',
- ]
- 1
- 2
- 3
- 4
- 5
实现简单的反爬
有了上面的基础我们可以实现一个简单的反爬措施, 将上面的代码改写:
- from django.http import HttpResponseForbidden
- def simple_middleware(get_response):
- print("进入中间件")
- def middleware(request):
- # 获取 UA
- user_agent = request.META['HTTP_USER_AGENT']
- # 判断 UA 中是否包含 Chrome 浏览器
- if not 'chrome' in user_agent.lower():
- return HttpResponseForbidden()
- ...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
类定义中间件
使用类定义效果和函数定义相同, 但是类可以使用更好的方式
- class SimpleMiddleWare(http://www.my516.com):
- def __init__(self, get_response):
- self.get_response = get_response
- print('== 进入中间件 ==')
- def __call__(self, request):
- print('== 处理请求前 ==')
- response = self.get_response(request)
- print('== 处理请求后 ==')
- return response
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
同样也需要注册
- MIDDLEWARE = [
- ...
- 'firstapp.middleware.SimpleMiddleWare'
- ]
- 1
- 2
- 3
- 4
多个中间件
如果过设置了多个中间件, 执行时就会按 settings 中的导入顺序执行, 第一个中间件执行到 response = get_response(request) 时, 就会去调用下一个中间件 , 依次类推 , 从里往外执行
例如上面两种写法如果在一起运行的话, 运行结果就会是:
== 进入中间件 ==
进入中间件
处理请求前
== 处理请求前 ==
== 处理请求后 ==
处理请求后
---------------------
[django] 中间件
来源: http://www.bubuko.com/infodetail-3148626.html