Django中间件报错TypeError: object() takes no parameters 求助
解决Django中间件的TypeError: object() takes no parameters错误
这个错误我之前也踩过坑,几乎都是因为自定义中间件没遵循Django的接口规范导致的,大概率是你的中间件类的初始化或调用方法写得不对。下面给你拆解常见问题和正确的写法:
最常见的问题:__init__方法参数错误
Django 1.10+的类式中间件要求__init__方法必须接受get_response参数,如果你错误地定义了无参数的__init__,Django传递参数时就会触发这个错误。
错误写法:
class MyMiddleware: def __init__(self): # 这里没有接收get_response参数,直接报错 pass
正确写法:
class MyMiddleware: def __init__(self, get_response): self.get_response = get_response # 这里可以写只执行一次的初始化代码(比如加载全局配置)
第二个常见问题:缺少__call__方法
新风格的中间件必须实现__call__方法,用来处理请求的前后逻辑。如果你的类只定义了__init__但没有__call__,也会引发错误。
完整的正确中间件示例:
# 假设在你的app目录下创建了middleware.py文件 class MyCustomMiddleware: def __init__(self, get_response): self.get_response = get_response # 服务器启动时只会执行一次的初始化操作 def __call__(self, request): # --- 请求处理前的逻辑 --- # 比如记录请求时间、验证用户权限等 print("开始处理请求前的前置操作") # 把请求传递给下一个中间件或视图 response = self.get_response(request) # --- 请求处理后的逻辑 --- # 比如修改响应头、记录响应状态等 print("请求处理完成后的后置操作") return response
最后检查settings.py的配置
确保你在MIDDLEWARE列表里正确添加了中间件的完整路径,注意中间件的顺序会影响执行逻辑:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 你的自定义中间件,路径要对应实际位置 'your_app_name.middleware.MyCustomMiddleware', ]
额外提醒
如果你还在使用Django 1.10之前的旧版本(不推荐),中间件是基于process_request、process_response等方法的类或函数式写法,但现在几乎都用新的类式规范了,建议优先适配新版本。
内容的提问来源于stack exchange,提问作者yg lin
相关产品推荐
相关产品推荐

