在学习 python 时,我本地使用 Django 3.1 ,示例使用老版本的Django ,添加中间件的代码如下:
from django.http import HttpResponse class BlockedIPSMiddleware(object): '''中间件类''' EXCLUDE_IPS = ['192.168.43.28'] # 禁止访问的地址列表 def process_view(self, request, view_func, *view_args, **view_kwargs): '''视图函数调用之前会调用''' user_ip = request.META['REMOTE_ADDR'] print(user_ip) if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS: # 运行验证时,启动服务时指明ip,设置ALLOWED_HOSTS = ['*'] return HttpResponse('<h1>Forbidden</h1>')我本地运行报错: TypeError: object() takes no parameters,
......(省略) File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "D:\0901\test4\test4\wsgi.py", line 16, in <module> application = get_wsgi_application() File "D:\py_flask2\lib\site-packages\django\core\wsgi.py", line 13, in get_wsgi_application return WSGIHandler() File "D:\py_flask2\lib\site-packages\django\core\handlers\wsgi.py", line 127, in __init__ self.load_middleware() File "D:\py_flask2\lib\site-packages\django\core\handlers\base.py", line 58, in load_middleware mw_instance = middleware(handler) TypeError: object() takes no parametersDjango版本更新,使用了新的中间件设置。
新版本的中间件类 中必须接收一个get_response 参数。见官方文档和例子:编写自己的中间件 。
使用与官网的例子一样,在中间件类中定义一个 __init__ 函数和一个 __call__ 函数。接收 get_response 参数。
from django.http import HttpResponse class BlockedIPSMiddleware(object): '''中间件类''' def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) return response EXCLUDE_IPS = ['192.168.43.28'] # 禁止访问的地址列表 def process_view(self, request, view_func, *view_args, **view_kwargs): #...省略针对 中间件的1.10之前 和 1.10之后的版本兼容问题,Django 官方给出指导: 升级 Django 1.10 之前的中间件 。
实际使用很简单,自定义中间件 继承 MiddlewareMixin,其他的代码完全不变。
from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixin class BlockedIPSMiddleware(MiddlewareMixin): EXCLUDE_IPS = ['192.168.43.28'] # 禁止访问的地址列表 def process_view(self, request, view_func, *view_args, **view_kwargs): '''视图函数调用之前会调用''' user_ip = request.META['REMOTE_ADDR'] print(user_ip) if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS: # 运行验证时,启动服务时指明ip,设置ALLOWED_HOSTS = ['*'] return HttpResponse('<h1>Forbidden</h1>')转载: https://blog.csdn.net/qq_23996069/article/details/104922501