在Post-Redirect-Get之后没有显示Django 1.5会话变量

时间:2013-04-24 15:10:18

标签: python django session

使用Django 1.5.1,我在INSTALLED_APPS以及MIDDLEWARE_CLASSES

中启用了会话

我有django.views.generic.edit.CreateView,负责在注册时创建新用户。那部分工作正常。它还会向新用户发送电子邮件以激活其帐户。这也很好。

提交表单并确定表单有效后,用户将被重定向到成功URL。在该成功网址页面上,我想告知他们已将电子邮件发送到他们的电子邮件地址,例如“电子邮件已发送至foo@bar.com”

我在重定向生成之前一直在表单视图中使用self.request.session['email'] = user.email。本地(使用sqlite DB后端),这非常有效。加载重定向时,我看到“已发送电子邮件至foo@bar.com”。

但是,当我将其部署到我的登台服务器时,我看到“已发送电子邮件到”。如果我手动刷新该页面,则会正确显示该电子邮件。我的登台服务器上的DB后端是MySQL。

def form_valid(self, form):
    user = form.save()
    self.request.session['email'] = user.email
    self.send_notification(user)
    return super(AccountCreateFormView, self).form_valid(form)

编辑:

在模板中,我有以下内容:

An email has been sent to {{ request.session.email }}.

1 个答案:

答案 0 :(得分:1)

在这个问题上花了一天之后,我发现了解决方案:

我从uWSGI 1.0.2.1 升级到 1.9.8

我确认回到1.0.2.1导致问题重新出现。我没有解释为什么会出现这种情况,但是,最新的uWSGI可能并不是一个坏主意。


进一步调查显示,我遇到的问题是在其他地区发生的。例如:

在管理区域中,我会将用户从活动状态更改为非活动状态,然后保存表单,将我重定向回用户列表。单击刚刚停用的同一用户后,将显示复选框。刷新页面将显示不再检查“活动”。

以下是您可能不期望的部分:第二次刷新页面会导致Active显示为已选中!

我也看到了同样的行为。因此,我创建了一个仅包含request.user.first_name{% now "U u" %}的简单模板。时间戳的目的是确定是否正在缓存渲染的模板。

在一个标签中,我更新了用户的名字。在另一个选项卡中,我快速刷新了新模板。这导致值与值之间的交替。时间戳正确递增,没有缓存。

我想也许是我的浏览器(firefox)。我以隐身模式打开了chrome。在chrome中,我打开了新模板。在firefox中,我提交了表单来更改用户名。回到chrome,我开始快速刷新。同样的确切行为。

跳转到dbshel​​l并直接命中mysql db总是给我正确的值,没有交替。

为了统治某些事情,我尝试了以下方法:

  • 将默认CACHES后端设置为DummyCache(不起作用)
  • CACHE_MIDDLEWARE_ANONYMOUS_ONLY设为True
  • 安装django-debug-toolbar直接查看SQL。刷新工具栏的sql很快就会导致它替换值!

我升级到django 1.5.1后才开始观察这个问题。以前我在django 1.4.2上。

总而言之,我建议将其称为 django / uwsgi不确定性原则