删除所有django.contrib.messages

时间:2016-09-15 18:47:22

标签: django django-shell django-messages

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

我担心当我将其推送到制作时,用户将看到所有生成它们的页面的旧消息。有没有办法从django shell

为所有用户清除这些消息

2 个答案:

答案 0 :(得分: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]
    
  4. 或使用首选的django-ish方式删除它们:

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

    此方法的缺点是,您必须仅删除邮件,如果它是已登录用户的第一次访问,然后不再执行此操作,因为您希望用户能够查看其邮件从现在开始。

    1. 只需删除中间件并完全放开邮件,如果您不需要,请不要使用它。

答案 1 :(得分:0)

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

如果您想确定这些消息无法显示,您可以disable the messaging framework

  

如果您不想使用消息,可以删除' django.contrib.messages'来自您的INSTALLED_APPS,来自MIDDLEWARE的MessageMiddleware行,以及来自TEMPLATES的消息上下文处理器。