2016-05-24 72 views
1

我有一个奇怪的问题,我正在努力与Django会议。基本上我的会话创建正确,但出于某种原因,我无法检索后会话数据的内容。Python/Django和会话问题

下面是基本的一步一步的指导

第1步:我访问网页和(预期)我没有一个有效的会话呢。

HOMEPAGE: SESSION VALUE session_key: None userSecureId: None END HOMEPAGE: SESSION VALUE

第2步:我登录时,产生的Django的一个会话,然后将用户重定向到他的部分

这里是如何生成我的会议,以及如何重定向我的用户: context = RequestContext(request) request.session['userSecureId'] = verify_token['userSecureId'] request.session.set_expiry(3600) return HttpResponseRedirect('http://mywebsite/portal/'+verify_token['userSecureId'], context)

这是我在日志中找到(我只是做了HttpResponseRedirect之前打印此右):

AUTH PAGE: SESSION VALUE session_key: None userSecureId: 4d9f6a58-0ad4-4a4b-8191-bbfc8e397afe END AUTH PAGE: SESSION VALUE

所以截至目前,Django的创造了我的会话,并能够检索userSecureId

步骤3的

值:由于种种原因,userSecureId的价值ResponseRedirect过程中丢失。这时我的web应用程序检测我的cookie,并能够检索会话密钥,但userSecureId回报“无”

HOMEPAGE: SESSION VALUE session_key: co5nknkz7kmka82f5130098gxoyvxkf8 userSecureId: None END HOMEPAGE: SESSION VALUE

只是为了确认我的会议是在Django的侧面配置正确,如果我解码session_data是的django_session其中session_key ='co5nknkz7kmka82f5130098gxoyvxkf8',然后我能够正确检索值(意味着userSecureId存在)

另一个问题是此代码在我的本地系统上完美工作。所以我只是想知道我是否错过了一些东西。我正在使用远程数据库来存储会话信息,并且我已经确认我的远程系统可以联系数据库。

我试图改变我的settings.py(例如:添加SESSION_COOKIE_SECURE,SESSION_COOKIE_DOMAIN,SESSION_COOKIE_HTTPONLY,SESSION_SAVE_EVERY_REQUEST但他们都不似乎影响我的应用程序的一般行为

上什么可能是

回答

0

不要把任何想法,“安全令牌“放入URL路径中,URLs a存放在浏览器历史记录等许多地方,它们是public,而不是”secure“

Django会为你创建一个会话ID,如果你切换会话cookie至http_only(使用SESSION_COOKIE_HTTPONLY=True在设置中)并使用自动创建的csrf_token,那么它已经安全。

根本就

HttpResponseRedirect('http://mywebsite/portal/') 

然后在该页面的查看功能,检查用户身份验证(也应该是一个@decorator)。

关于您的问题,您正确使用session

request.session['mykey'] = 'My Value' 

在使用用户的会话cookie值自动访问的会话上创建一个key:value对。

如果不保存修改后的会话值,你可以尝试设置

request.session.modified = True 

告诉Django的会话数据改变。

+0

感谢您的建议。然而,这并不能解释为什么当我远程托管我的django应用程序时,我无法在ResponseRedirect之后检索会话的值(如果我重定向到/ portal/或只是/ portal)。 – PERPO

+0

我是否正确理解会话值被写入会话存储数据库? – C14L

+0

你是对的。会话值存储在我的数据库中。这些数据包括一些用户ID信息,电子邮件和我的服务所需的其他各种信息。我们的想法是,只要有可能将用户指向某个特定的url(检查userSecurId是否存在以确认用户被批准使用该应用),就可以检索此值。 – PERPO