【问题标题】:Delete all django.contrib.messages删除所有 django.contrib.messages
【发布时间】:2017-01-23 21:43:09
【问题描述】:

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

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

【问题讨论】:

  • 这些消息存储在哪里?您是否将它们存储在 django 的会话中?
  • 是的,在这种情况下,我使用会话来存储它们。

标签: django django-shell django-messages


【解决方案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. 只需移除中间件,完全放弃消息,如果您不需要它,请不要使用它。

【讨论】:

    【解决方案2】:

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

    如果您想确保这些消息不会显示,您可以disable the messaging framework

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2016-07-15
      • 1970-01-01
      • 2012-03-21
      • 2021-10-13
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多