【问题标题】:Django 1.5 session variable not showing after Post-Redirect-Get后重定向获取后未显示 Django 1.5 会话变量
【发布时间】:2013-04-28 12:38:36
【问题描述】:

使用 Django 1.5.1,我在 INSTALLED_APPSMIDDLEWARE_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 }}.

【问题讨论】:

  • 其他基于会话的机器在生产中工作正常吗? I.E django admin,你可以在那里登录吗?
  • form_valid 如果您直接将CreateView 子类化,则实际上将表单保存在父类中,因此您可以执行self.request.session['email'] = form.instance.email 并删除您的user 对象。我知道这对你的问题没有多大帮助......
  • 我可以登录 django 管理区域以及我的自定义客户区域。
  • 很高兴认识 Ngenator,谢谢!
  • 如果send_notification 期待User 对象,我猜你不能。呃,我总是想念这样的小事,哈哈……

标签: python django session


【解决方案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 不确定性原理

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2010-12-24
    • 1970-01-01
    • 2014-03-18
    • 2014-08-14
    • 2017-03-31
    相关资源
    最近更新 更多