2014-10-22 188 views
1

我一直在研究一个小项目,并开始想知道如何在用户登录或注销后保留一些数据。Django会话 - 在登录/注销之间保持会话数据

例如,假设用户正在将商品添加到他的购物车并且他没有登录。默认情况下,Django会话会在用户登录或注销后生成新的session_id。 当用户将5件产品添加到他的购物车时,他之后登录,那么他的购物车将被清除。

如何在用户数据中实现持久化元素?例如,我应该使用一些信号还是某种中间件来将购物车从旧到新的会话绑定?

我的主要目标是保持安全,所以我不想禁用一些安全机制。

+1

您可以使用cookie或本地存储保存数据http://stackoverflow.com/questions/3220660/local-storage-vs-cookies并在用户登录后通过AJAX发送 – madzohan 2014-10-22 11:13:36

+0

这似乎是很好的解决方案。 Cookie很容易修改,因此对于cookie值,我应该设置生成例如UUID?所以盗取篮子会更困难:) – Efrin 2014-10-22 11:18:28

+0

使用可以使用'安全'cookies。 https://docs.djangoproject.com/zh/dev/topics/security/ 如果浏览器最初通过HTTP(大多数浏览器的默认设置)进行连接,则可能会泄漏现有Cookie。出于这个原因,您应该将您的SESSION_COOKIE_SECURE和CSRF_COOKIE_SECURE设置设置为True。这指示浏览器仅通过HTTPS连接发送这些cookie。请注意,这将意味着会话无法通过HTTP进行工作,并且CSRF保护将阻止任何通过HTTP接受的POST数据。 – madzohan 2014-10-22 11:33:30

回答

1

您必须使用数据库支持的会话。从文档:

您需要将'django.contrib.sessions'添加到您的INSTALLED_APPS 设置中。

配置完安装后,运行manage.py migrate以安装存储会话数据的单个数据库表。

然后,你必须确保session.flush()不是在注销/登录过程调用,女巫意味着避免使用django.contrib.auth.logout()巫婆将调用调用Session.flush(),它也被称为在django.contrib.login()login and logout用户自己避免丢失会话数据。来源为login/logout

0

作为安全措施,会话在登录/注销时被刷新。如果您想保留一些变量,你可以使用该解决方案:

https://stackoverflow.com/a/41849076/146289

它基本上包括备份旧的值,然后在新的会话恢复它们。