我最近发现Django web应用中的一个模块使用了django.contrib.messages,但是模板的上下文处理器没有添加django.contrib.messages.context_processors.messages处理器。我担心当我把它推向生产时,用户会看到所有页面的旧消息,有没有办法从django shell中清除所有用户的这些消息?
django.contrib.messages
django.contrib.messages.context_processors.messages
django shell
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.只要删除中间件,完全放弃消息,如果不需要,就不要使用它。
5gfr0r5j2#
消息通常存储在会话或cookie中(检查您的存储后端),您可以从那里清除它们,但它们会在会话/cookie正常清除时被清除(最坏情况下是用户注销时)。如果要确保不显示这些消息,可以禁用消息传递框架:如果你不想使用消息,你可以从INSTALLED_APPS中删除'django.contrib.messages',从MIDDLEWARE中删除MessageMiddleware行,从TEMPLATES中删除消息上下文处理器。
e0bqpujr3#
下面的代码可以删除所有消息:
list(messages.get_messages(request))
3条答案
按热度按时间cwxwcias1#
消息将显示给那些会话已经包含该消息的用户。因此您有几个选项可供选择。
1.如果您使用的是默认设置,并且会话数据存储在数据库表中,您可以遍历活动会话,查看是否为它们存储了任何消息。
1.如果你不使用默认设置,并将会话数据存储在其他地方(Redis?),或者你不想使用之前的方法,你可以删除所有的会话。这会有一个缺点,你的用户将被注销(这可能是一个可以接受的后果)
1.你可以对用户的每个请求都这样做,你需要删除会话的消息而不删除所有的会话对象。
或者用django-ish的方式删除它们:
这种方法的缺点是,如果这是已经登录的用户第一次访问,您必须只删除消息,然后不要再这样做,因为您希望您的用户从现在开始能够查看他们的消息。
1.只要删除中间件,完全放弃消息,如果不需要,就不要使用它。
5gfr0r5j2#
消息通常存储在会话或cookie中(检查您的存储后端),您可以从那里清除它们,但它们会在会话/cookie正常清除时被清除(最坏情况下是用户注销时)。
如果要确保不显示这些消息,可以禁用消息传递框架:
如果你不想使用消息,你可以从INSTALLED_APPS中删除'django.contrib.messages',从MIDDLEWARE中删除MessageMiddleware行,从TEMPLATES中删除消息上下文处理器。
e0bqpujr3#
下面的代码可以删除所有消息: