使用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”。
但是,当我将其部署到我的临时服务器时,我看到“一封电子邮件已发送到”。如果我手动刷新该页面,它将正确显示电子邮件。我的临时服务器上的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 }}.发布于 2013-04-28 12:38:37
在这个问题上花了一天的时间后,我发现了解决方案:
我从uWSGI 1.0.2.1升级到1.9.8。
我验证了返回到1.0.2.1会导致问题再次浮出水面。我没有解释为什么会出现这种情况,但尽管如此,使用最新的uWSGI可能也不是一个坏主意。
进一步的调查显示,我遇到的问题也发生在其他领域。例如:
在管理区域中,我将用户从活动状态更改为非活动状态,然后保存表单,将我重定向回用户列表。单击我刚刚停用的同一用户后,复选框将显示为选中状态。刷新页面将显示"Active“不再处于选中状态。
这是您可能没有预料到的部分:第二次刷新页面将导致Active显示为选中状态!
我在我自己的表单中也看到了同样的行为。所以我创建了一个只包含request.user.first_name和{% now "U u" %}的简单模板。时间戳的目的是确定呈现的模板是否被缓存。
在一个选项卡中,我更新了用户的名字。在另一个选项卡中,我快速刷新了新模板。这导致它在新值和旧值之间切换。时间戳已正确递增,没有缓存。
我想可能是因为我的浏览器(firefox)。我在隐身模式下打开了chrome。在chrome中,我打开了新的模板。在firefox中,我提交了更改用户名的表单。回到chrome,我开始快速刷新。完全一样的行为。
跳到dbshell并直接访问mysql数据库总是给出正确的值,而不是交替。
为了排除某些事情,我尝试了以下方法:
CACHES后端设置为DummyCache (不起作用),CACHE_MIDDLEWARE_ANONYMOUS_ONLY设置为django-debug-toolbar以直接查看SQL。快速刷新工具栏的sql会导致它也替换其他值!我是在升级到django 1.5.1之后才开始观察这个问题的。之前我使用的是django 1.4.2。
总之,我建议将其称为django/uwsgi不确定性原理。
https://stackoverflow.com/questions/16195624
复制相似问题