如果不安装django.contrib.messages.middleware.MessageMiddleware,则无法添加消息

时间:2013-04-06 14:51:31

标签: django django-admin

我是Django的新手。 我正在尝试运行应用程序,我需要向管理员添加新用户。服务器正在运行。当我输入信息冷杉新用户并点击“保存”时,我收到以下错误。我正在使用django-trunk。

MessageFailure at /admin/auth/user/add/
You cannot add messages without installing
django.contrib.messages.middleware.MessageMiddleware

Request Method: POST
Request URL:    http://localhost:8000/admin/auth/user/add/
Django Version: 1.6.dev20130403090717
Exception Type: MessageFailure
Exception Value:    You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware

有关可能发生的事情的任何想法?

8 个答案:

答案 0 :(得分:18)

对我来说,问题是单元测试所特有的。事实证明,某些中间件无法在某些单元测试中使用,更多信息请点击这里:

https://code.djangoproject.com/ticket/17971

在这里:

Why don't my Django unittests know that MessageMiddleware is installed?

我的解决方案是模拟这些测试的消息框架,可能有更好的解决方案(django测试客户端?)

答案 1 :(得分:10)

检查INSTALLED_APPS中的django.contrib.messagesMIDDLEWARE_CLASSES中的django.contrib.messages.middleware.MessageMiddleware是否有{{1}}。

答案 2 :(得分:4)

检查是否

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

而不是

MIDDLEWARE = (
   'django.middleware.common.CommonMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
)

元组名称应为MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES折旧https://docs.djangoproject.com/en/2.1/releases/1.10/#id3

答案 3 :(得分:3)

2018更新 在Django 2.0+中,设置中的名称已更改。 现在,在设置中使用MIDDLEWARE代替列表的MIDDLEWARE_CLASSES

答案 4 :(得分:1)

我遇到了同样的错误。 您必须注意MIDDLEWARE_CLASSES中的中间件的顺序。 在final中插入相应的中间件。就像这样,

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

请注意订单安排。

答案 5 :(得分:1)

如果您运行的是普通的Django代码,则应添加 根据其他人的建议django.contrib.messages.middleware.MessageMiddleware进入您的中间件

如果您正在运行测试用例并使用请求工厂,则正如上面@hwjp回答的那样,这是一个错误(无法修复)。请求工厂不会调用中间件,开发人员也无意更改此行为。

但是有一个简单的解决方案。

在测试设置文件(即settings/test.py)中添加以下行

MESSAGE_STORAGE = 'dja ngo.contrib.messages.storage.cookie.CookieStorage'

在测试代码中,您可以编写这样的代码

request = RequestFactory().get("/")
# Add support  django messaging framework
request._messages = messages.storage.default_storage(request)

就是这样。将此请求对象传递给使用django消息的任何代码都可以正常工作。

答案 6 :(得分:0)

通常将utf8_decode()称为WSGI_request作为request方法的参数时,可能会出错[{1}}

答案 7 :(得分:0)

如果在测试中需要请求,可以按照@Ramast 的建议进行模拟。 我发现 the bug ticket(已关闭,无法修复)中提到的解决方案很有帮助。

from django.contrib.messages.storage.fallback import FallbackStorage
from django.test import RequestFactory


def dummy_request():
    """Dummy request for testing purposes with message support."""
    request = RequestFactory().get('/')
    # Add support django messaging framework
    setattr(request, 'session', 'session')
    setattr(request, '_messages', FallbackStorage(request))
    return request