request.session.flash() 和 .pop_flash()

1 投票
2 回答
2225 浏览
提问于 2025-04-17 09:30

每当我提交一个表单时,我都会显示错误信息。不过,我添加这些信息到队列的方式有点问题,导致有些信息在我提交表单后还留着,而有些则消失了。我发现这是因为我添加信息到队列的方式不对。

正常情况下,添加信息的方法是这样的:

post_data = request.POST
if 'submit' in post_data:
    ... function(post_data) ...
    if ...:
        request.session.flash(u'This is some error message')
    request.session.flash(u'Maybe some other error message')

在mako文件中:

<html>...<body>...
% for m in request.session.pop_flash():
  <div class="alert-message">
    <p>${m}</p>
  </div>
% endfor
...</body></html>

但是,我希望有些信息的处理方式是这样的:

if 'submit' in post_data: 
    messages = function(...) # output is always a list
    for m in messages:
        request.session.flash(m)

这样做的时候,每次我重新提交同一个表单,之前的所有信息都会再次被添加到.flash()中。因此,错误信息就会不断累积。请问我该如何解决这个问题或者找到一个替代方法呢?

2 个回答

0

要回答这个问题其实挺难的,因为没有太多背景信息来说明它的目的。一般来说,使用闪存(flash)工作流程的想法是,你先把信息发送到表单,然后再把用户引导到一个地方,在那里所有的闪存消息都会显示出来。你所描述的情况是多次发送信息,而不一定是显示这些消息。

  • 你可以让视图在添加更多内容之前先清空闪存队列。
  • 你可以在发送数据时带上一个标记?
  • 你也可以不使用闪存,换一种方式来处理这个情况。

我能想到的闪存队列在你显示消息时没有被清空的原因有:

  • 你返回了自己的响应对象,导致会话工厂无法设置新的会话cookie。
  • 你的代码产生了异常,这可能导致会话工厂忽略cookie的变化。
2

我找到了问题所在,但不太明白为什么会这样。在之前,我把 message 当作一个关键字来使用:

@classmethod
def validate(cls, message=[], **kwargs):
    if this:
        message.append(u'...')
    return kwargs, message

我觉得在每次发送 POST 请求后,message 并没有被清空,即使我从来没有用 validate() 调用过它。不过,当我把 message 这个关键字去掉后,它就正常工作了:

@classmethod
def validate(cls, **kwargs):
    message = []
    ...

有人知道这是为什么吗?

撰写回答