2016-09-15 89 views
1

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

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

+1

这些消息存储在哪里?你把它们存储在django的会话中吗? – SpiXel

+0

是的,在这种情况下,我正在使用会话来存储它们。 – Jedi

回答

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的上下的方式将其删除:

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

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

  1. 只要删除中间件,完全放弃消息,如果你不需要它,就不要使用它。
0

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

如果你想以确保这些信息不显示,你可以disable the messaging framework

如果你不想使用邮件,你可以从你的INSTALLED_APPS删除“django.contrib.messages” ,来自MIDDLEWARE的MessageMiddleware行和来自TEMPLATES的消息上下文处理器。