1

我最近意识到我们的 Django Web 应用程序中的一个模块正在使用 django.contrib.messages。但是,模板的上下文处理器没有django.contrib.messages.context_processors.messages添加处理器。

我担心当我将其推送到生产环境时,用户会看到所有生成它们的页面的所有旧消息。有没有办法为所有用户清除这些消息django shell

4

2 回答 2

1

将为会话已包含该消息的用户显示消息。所以你有几个选择要做。

  1. 如果您使用默认设置并且会话数据存储在数据库表中,您可以遍历活动会话并检查是否为它们存储了任何消息。

    from django.contrib.sessions.models import Session
    for s in Session.objects.all():  
        decoded_data_dict = s.get_decoded()  
        # Now you look for messages in the dict, delete them (del dict[key]) and save the session 
    
  2. 如果您不使用默认设置并将会话数据存储在其他位置(Redis?),或者您不想采用以前的方式,则可以完全删除所有会话。这将有一个缺点,您的用户将被注销(这可能是可接受的结果)

  3. 您可以根据用户的每个请求执行此操作,您需要删除会话的消息而不删除所有会话对象。像下面这样的事情会做:

    for key in request.session.keys():  
        del request.session[key]
    

或使用首选的 django-ish 方式删除它们:

    storage = messages.get_messages(request)
    storage.used = True

这种方法的缺点是您必须只删除消息,如果它是已登录用户的第一次访问,然后不要再这样做,因为您希望您的用户能够从现在开始查看他们的消息.

  1. 只需删除中间件并完全放弃消息,如果您不需要它,请不要使用它。
于 2016-09-15T19:13:29.857 回答
0

消息通常存储在会话或 cookie 中(检查您的存储后端)。您可以从那里清除它们,但是当会话/cookie 通常被清除时(最坏的情况是在用户注销时),它们将被清除。

如果您想确保这些消息不显示,您可以禁用消息传递框架

如果您不想使用消息,可以从 INSTALLED_APPS 中删除“django.contrib.messages”,从 MIDDLEWARE 中删除 MessageMiddleware 行,从 TEMPLATES 中删除消息上下文处理器。

于 2016-09-15T18:56:31.670 回答