我自己想做自定义中间件的想法起源是我想给我的api增加一个ip访问记录,以及访问次数统计的功能,
说干就干,然后就百度了一下,看了几篇文章,然后就动手试了试,中间件的话还是挺简单的,
1.首先在项目的个目录下新建一个文件夹,用来放自定义的中间件,
这里我在项目根目录下/建立了xmiddleware文件夹,然后在该文件夹中建立了middleware.py文件
./xmiddleware/middleware.py
2.一定要在setting.MIDDLEWARE 中添加你自己定义的中间件,不然是不会生效的,添加后记得加上逗号,分隔
3.我自己定义的中间件代码如下 # middleware.py
from django.utils.deprecation import MiddlewareMixin # 一定要导入
# 打印出客户端的ip
class Xmiddleware(MiddlewareMixin):
def process_request(self,request): # 因为是继承自MiddlewareMixin 的 所以他里面的方法名不能改变
# 自定义中间件逻辑开始
if request.META.get('HTTP_X_FORWARDED_FOR'):
ip = request.META.get("HTTP_X_FORWARDED_FOR") # 过滤掉nginx的方向代理,避免获取到的是本地的ip
else:
ip = request.META.get("REMOTE_ADDR")
print("ip : ", ip)
# 自定义中间件逻辑结束
4. setting.py中注册自己写好的中间件
MIDDLEWARE = [
'xmiddleware.kaishimid.Xmiddleware', # 这是我自己定义的中间件,我放在第一了,避免他不执行
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
5.在浏览器中打开http://127.0.0.1:8000/
然后返回你的pycharm 终端就可以看到中间件打印出来的ip了
# ip : 127.0.0.1 这是我自己pc打开的地址
# ip : 192.168.2.113 这是我通过 python manage.py runserver 0.0.0.0:8080 方式开启所得到的客户端地址,
证明中间件逻辑是没有问题的,奥利给
以前的话我是自己给每一个视图加上装饰器来获取,这种做法一点都不优雅,甚至还有点蠢,
中间件的方式能够很好的解决这个问题,
中间件在你没有写views的情况下也是能够正常的执行的
在自定义中间件中加入相应的统计代码就可以实现我想要的功能啦,完美!