1

使用 Django 1.5.1,我启用了会话INSTALLED_APPS以及MIDDLEWARE_CLASSES

我有一个django.views.generic.edit.CreateView负责在注册时创建新用户。那部分工作得很好。它还会向新用户发送一封电子邮件以激活他们的帐户。这也很好用。

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

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

但是,当我将它部署到我的登台服务器时,我看到“一封电子邮件已发送到 ”。如果我手动刷新该页面,则它会正确显示电子邮件。我的登台服务器上的数据库后端是 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 }}.
4

1 回答 1

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为真
  • 安装django-debug-toolbar了直接看SQL。快速刷新工具栏的 sql 也会导致它交替值!

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

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

于 2013-04-28T04:38:36.567 回答