【问题标题】:Django middleware 'module' object is not callableDjango 中间件“模块”对象不可调用
【发布时间】:2016-11-23 10:07:14
【问题描述】:

我对中间件有疑问,我发现了很多关于它的问题,但对我的情况没有任何帮助。

我使用中间件让 current_user 在我的模型中使用,以在 save 方法中保存修改后的用户,而不在视图中写入。

这里是original post,代码如下:

中间件

from threading import local

_user = local()


class CurrentUserMiddleware(object):
    def process_request(self, request):
        _user.value = request.user


def get_current_user():
    return _user.value

这段代码有问题,因为我收到如下错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python35-32\Lib\wsgiref\handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\contrib\staticfiles\handlers.py", line 63, in __call__
    return self.application(environ, start_response)
  File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\wsgi.py", line 158, in __call__
    self.load_middleware()
  File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\base.py", line 53, in load_middleware
    mw_instance = mw_class()
TypeError: 'module' object is not callable
[20/Jul/2016 10:51:44] "GET /panel/ HTTP/1.1" 500 59
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python35-32\Lib\wsgiref\handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\contrib\staticfiles\handlers.py", line 63, in __call__
    return self.application(environ, start_response)
  File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\wsgi.py", line 158, in __call__
    self.load_middleware()
  File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\base.py", line 53, in load_middleware
    mw_instance = mw_class()
TypeError: 'module' object is not callable
[20/Jul/2016 10:51:44] "GET /favicon.ico HTTP/1.1" 500 59

我的中间件设置:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.gzip.GZipMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'reversion.middleware.RevisionMiddleware',
    'task.current_user',
)

你能给我一些建议吗?我没有其他想法可以尝试,所以我希望你有一些。

【问题讨论】:

  • 请显示您的中间件设置。另外,永远不要这样做
  • @DanielRoseman 你的意思是永远不要这样做? / 我更新了问题并添加了中间件设置
  • task.curreny_user.py 里面有什么?我可以看看你的项目树结构吗?

标签: python django django-middleware


【解决方案1】:

您必须提供中间件的完整路径。不是包含中间件的模块。

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.gzip.GZipMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'reversion.middleware.RevisionMiddleware',
    'task.current_user.CurrentUserMiddleware',
)

请注意,上面有很多示例。

【讨论】:

    【解决方案2】:

    就我而言,我的自定义中间件错过了 call 方法。因此,您可以尝试检查您的自定义迁移并添加 call 方法,如果它错过了。 Django 推荐此代码作为默认代码:

        def __call__(self, request):
            response = self.get_response(request)
            return response
    

    https://docs.djangoproject.com/en/3.2/topics/http/middleware/#writing-your-own-middleware

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-17
      • 2012-09-28
      • 2014-09-21
      • 2022-01-09
      • 2021-12-26
      • 2011-05-30
      相关资源
      最近更新 更多