删除所有django.contrib.消息

63lcw9qa  于 2023-02-05  发布在  Go
关注(0)|答案(3)|浏览(115)

我最近发现Django web应用中的一个模块使用了django.contrib.messages,但是模板的上下文处理器没有添加django.contrib.messages.context_processors.messages处理器。
我担心当我把它推向生产时,用户会看到所有页面的旧消息,有没有办法从django shell中清除所有用户的这些消息?

cwxwcias

cwxwcias1#

消息将显示给那些会话已经包含该消息的用户。因此您有几个选项可供选择。
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

1.如果你不使用默认设置,并将会话数据存储在其他地方(Redis?),或者你不想使用之前的方法,你可以删除所有的会话。这会有一个缺点,你的用户将被注销(这可能是一个可以接受的后果)
1.你可以对用户的每个请求都这样做,你需要删除会话的消息而不删除所有的会话对象。

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

或者用django-ish的方式删除它们:

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

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

5gfr0r5j

5gfr0r5j2#

消息通常存储在会话或cookie中(检查您的存储后端),您可以从那里清除它们,但它们会在会话/cookie正常清除时被清除(最坏情况下是用户注销时)。
如果要确保不显示这些消息,可以禁用消息传递框架:
如果你不想使用消息,你可以从INSTALLED_APPS中删除'django.contrib.messages',从MIDDLEWARE中删除MessageMiddleware行,从TEMPLATES中删除消息上下文处理器。

e0bqpujr

e0bqpujr3#

下面的代码可以删除所有消息:

list(messages.get_messages(request))

相关问题