Django中间件
背景
获取用户访问的地址信息
1
2# 通过request的META属性获取,里面有一个REMOTE_ADDR
addr = requesst.META['REMOTE_ADDR']中间件的作用
中间件是程序在使用视图前调用的方法,借用这个我们可以介入用户请求和处理的内部
使用中间件
在对应应用的下面新建一个中间件文件【middleware.py】,名字可以自己定,但一般都叫这个
1
touch middleware.py
编辑中间件【middleware.py】的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50# 设置屏蔽用户的IP
from django.http import HttpResponse
# 需要继承MiddlewareMixin, 不然会报错
from django.utils.deprecation import MiddlewareMixin
# 切记中间件的函数名称就叫process_view,断不可改
class BlockedIPMiddleware(MiddlewareMixin):
blockip=['192.168.0.115']
def __init__(self, get_response):
'''服务器重启后,接受到第一个request时调用的方法
get_response:必须要添加的参数,不知原因
'''
# self.get_response:一定要加上,原因不明
self.get_response = get_response
print("---init---")
def process_request(self, request):
'''服务器生成request对象后,未匹配url之前执行,request参数表示生成的request对象'''
print('----process-request---')
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''视图函数调用之前会调用process_view方法
request:服务器生成的request对象
view_func:将要调用的视图函数
*view_args:url中匹配的位置参数
**view_kwargs:url中匹配的关键字参数
'''
ip = request.META['REMOTE_ADDR']
print(ip)
if ip in BlockedIPMiddleware.blockip:
return HttpResponse('forbiden')
def process_response(self, request, response):
'''视图函数调用完毕生成响应内容后,准备将相应内容发送给浏览器之前进行执行
request:表示服务器生成的request对象
response:表示视图函数返回的响应内容对象
'''
print('----response----')
# 该函数必须要返回一个响应内容
return response
def process_exception(self, request, exception):
'''视图函数调用出现问题后,会执行的函数
request:表示服务器生成的request对象
exception:表示视图函数执行的时候产生的异常信息
'''
print('----exception----')django提供的中间件接口函数如下:
- 任意一个函数只要返回的HttpResponse对象,则后面的过程就直接跳过
- 需要用到什么函数,就写哪个函数
函数名 作用 __init__ 服务器重启后,接受到第一个请求的时候调用 process_request 产生request对象,进行url匹配之前进行调用 process_view url匹配之后调用视图函数之前进行调用 process_response 视图函数调用之后,内容返回给浏览器之前进行调用 process_exception 视图函数异常的时候,会调用该函数 注意:如果注册的多个中间件间类中包含process_exception函数的时候,调用的顺序与注册的顺序是相反的
修改项目配置文件【settings.py】文件,将自定义的中间件文件注册到配置文件中
1
2
3
4MIDDLEWARE = [
# 依次对应的是【应用名.中间件文件名.Class名】
'wuxiang.middleware.BlockedIPMiddleware'
]