18

我是 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

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

4

8 回答 8

27

对我来说,问题是特定于单元测试的。事实证明,某些中间件在某些类型的单元测试中不起作用,更多信息在这里:

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

和这里:

为什么我的 Django 单元测试不知道安装了 MessageMiddleware?

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

于 2014-12-04T17:34:09.427 回答
10

检查您是否有django.contrib.messagesinINSTALLED_APPSdjango.contrib.messages.middleware.MessageMiddlewarein MIDDLEWARE_CLASSES

于 2013-04-07T06:15:27.183 回答
6

如果您正在运行普通的 django 代码,则应 django.contrib.messages.middleware.MessageMiddleware按照其他人的建议添加到中间件

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

然而,有一个简单的解决方案。

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

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

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

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

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

于 2020-02-13T23:44:53.720 回答
5

检查是否是

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

于 2017-03-15T12:00:01.070 回答
3

2018 更新在 django 2.0+ 中,设置中的名称已更改。现在使用MIDDLEWARE而不是MIDDLEWARE_CLASSES设置中的列表名称!

于 2018-06-26T19:39:23.013 回答
1

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

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

注意顺序排列。

于 2013-08-10T08:37:20.963 回答
1

WSGI_request当通常作为方法request的参数调用时,您可能会出错add_message()

于 2016-01-21T09:24:02.337 回答
0

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

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
于 2021-03-04T10:54:04.473 回答