使用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 }}.
答案 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,我开始快速刷新。同样的确切行为。
跳转到dbshell并直接命中mysql db总是给我正确的值,没有交替。
为了统治某些事情,我尝试了以下方法:
CACHES
后端设置为DummyCache(不起作用)CACHE_MIDDLEWARE_ANONYMOUS_ONLY
设为True django-debug-toolbar
直接查看SQL。刷新工具栏的sql很快就会导致它替换值!我升级到django 1.5.1后才开始观察这个问题。以前我在django 1.4.2上。
总而言之,我建议将其称为 django / uwsgi不确定性原则。