全部删除 django.contrib.messages

Delete all django.contrib.messages

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

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

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

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

If you don’t want to use messages, you can remove 'django.contrib.messages' from your INSTALLED_APPS, the MessageMiddleware line from MIDDLEWARE, and the messages context processor from TEMPLATES.

消息将显示给会话中已包含该消息的那些用户。所以你有几个选择。

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

    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?),或者您不想采用以前的方式,则可以完全删除所有会话。这将有一个缺点,您的用户将被注销(这可能是 acceptable 的后果)

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

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

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

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

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

  1. 干脆把中间件去掉,消息一并去掉,不需要就别用