Django中间件时出现TypeError: BlockedIP
2022-06-17 本文已影响0人
丙吉
在学习Django中间件是出现两种错误:
(1)TypeError: BlockedIPSMiddleware() takes no arguments
image.png(2)TypeError: init() takes 1 positional argument but 2 were given
image.png这两种错误,都是Django升级所致,解决方法有两种:加载包或在函数中加入参数。
加载包示例:
原始代码如下:
from django.http import HttpResponse
class BlockedIPSMiddleware(object):
EXCLUDE_IPS = ['127.0.0.1']
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''视图函数调用之前会调用'''
user_ip = request.META['REMOTE_ADDR']
if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS:
return HttpResponse('<h1>IP受限了哟,请更换IP</h1>')
报错中间件函数没有包含任何参数。
因为少了参数所致,所以要导入一个函数,并把让自定义函数继承这个类。
修改后的代码为:
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class BlockedIPSMiddleware(MiddlewareMixin):
EXCLUDE_IPS = ['127.0.0.1']
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''视图函数调用之前会调用'''
user_ip = request.META['REMOTE_ADDR']
if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS:
return HttpResponse('<h1>IP受限了哟,请更换IP</h1>')
image.png
第二个错误,自定义TestMiddleware时,加载包解决不了此问题,得在init中加入参数。
修改后的代码:
class TestMiddleware(MiddlewareMixin):
'''中间件类'''
def __init__(self, get_response):
'''服务器重启之后,接收第一个请求时调用'''
print('----init---')
self.get_response = get_response
def process_request(self, request):
'''产生request对象之后,url匹配之前调用'''
print('----process_request---')
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''在url匹配之后,视图函数调用之前'''
print('----process_view---')
def process_response(self, request, response):
'''在view视图函数调用之后,内容返回浏览器调用之前'''
print('----process_response---')
return response
image.png
最后再调用即可
image.png详细参考:
https://blog.csdn.net/xiaojin21cen/article/details/108400794