Skip to main content
 首页 » 编程设计

python之自定义中间件类引发错误

2025年05月04日17落叶无声

我想创建一个非常简单的中间件,它只在每次请求时打印“OK”。问题是它会引发错误:

Traceback (most recent call last): 
  File "c:\python27\Lib\wsgiref\handlers.py", line 85, in run 
    self.result = application(self.environ, self.start_response) 
  File "C:\Users\Milano\Desktop\Projekty\venvs\sfl_venv\lib\site-packages\django\contrib\staticfiles\handlers.py", line 63, in __call__ 
    return self.application(environ, start_response) 
  File "C:\Users\Milano\Desktop\Projekty\venvs\sfl_venv\lib\site-packages\django\core\handlers\wsgi.py", line 170, in __call__ 
    self.load_middleware() 
  File "C:\Users\Milano\Desktop\Projekty\venvs\sfl_venv\lib\site-packages\django\core\handlers\base.py", line 52, in load_middleware 
    mw_instance = mw_class() 
TypeError: __init__() takes exactly 2 arguments (1 given) 

中间件类在project/project/middleware.py

中间件.py

class UserHasProfileMiddleware(object): 
    def __init__(self, get_response): 
        self.get_response = get_response 
 
    def __call__(self, request): 
        response = self.get_response(request) 
        print 'OK' 
        return response 

SETTINGS.PY

MIDDLEWARE_CLASSES = ( 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'SolutionsForLanguages.middleware.UserHasProfileMiddleware' 
) 

你知道问题出在哪里吗?

请您参考如下方法:

Django 介绍 new-style middleware在 Django 1.10 中。

您的UserHasProfileMiddleware 是一个新型的中间件类。假设您使用的是 Django 1.10+,您应该使用 MIDDLEWARE 设置,而不是 MIDDLEWARE_CLASSES。所有其他中间件都来自 Django,因此重命名设置应该足以修复错误。

MIDDLEWARE = ( 
    ... 
) 

如果您使用的是 Django 1.9 或更早版本,您应该将 UserHasProfileMiddleware 类转换为 old-style middleware .