Django(Python)会话ID问题
我在使用sessionid时遇到问题:request.session.session_key
每次刷新页面或提交表单时都会生成一个新的密钥。
而这个:request.COOKIES[settings.SESSION_COOKIE_NAME]
却提示找不到'sessionid'这个键。
我是不是漏掉了什么?我需要一个在我网站的页面请求之间能够保持不变的“密钥”。我希望它即使在关闭浏览器后或过了三周也能保持有效。我该如何在Django中实现这个?
我需要配置什么吗?如果我对sessionid的理解有误,或者对它是如何生成的有误,请纠正我。
谢谢大家的回复。
祝好,
W
我的settings.py文件是:http://pastebin.com/G9qnD9En
2 个回答
我遇到过类似的问题,我是通过把 SESSION_COOKIE_NAME 设置成一个不同于默认的 'sessionid' 的名字来解决的。我觉得可能是谷歌分析搞乱了这个 cookie。
听起来你的浏览器没有接受Django发送的会话cookie。
你的浏览器应该能告诉你,应用程序的页面响应中设置了哪些cookie。检查一下是否真的发送了一个名为'sessionid'的cookie,并且域名和路径是否正确。
如果你在settings.py文件中错误地设置了SESSION_COOKIE_DOMAIN
或SESSION_COOKIE_PATH
,可能会导致Django在浏览器中设置的cookie无法返回到服务器。
如果你想验证整个设置,可以先看看这个链接:http://docs.djangoproject.com/en/1.2/topics/http/sessions/
简单来说,你需要:
- 在
INSTALLED_APPS
中包含'django.contrib.sessions'
; - 在
MIDDLEWARE_CLASSES
中包含'django.contrib.sessions.middleware.SessionMiddleware'
; 以及 - 在生产服务器上,你可能需要设置
SESSION_COOKIE_DOMAIN
和SESSION_COOKIE_PATH
,以便与同一域名或相关域名上的其他网络应用良好互动。
编辑:
看了你粘贴的设置,我发现有两个不同的问题,每个问题都足以导致会话cookie无法正常工作。
SESSION_COOKIE_DOMAIN
设置为"mydomain.com"一个通用顶级域名的cookie要求“域名”部分至少包含两个句点(".")分隔符。这是为了防止人们为像".com"这样的域名设置cookie。(我相信,国家级管辖范围内的域名需要三个句点。)
把这个改成".mydomain.com",浏览器就应该能返回这个cookie。
在开发阶段(在你的本地机器上,地址是127.0.0.1),把这个设置留空,否则你的浏览器根本不会接受这个cookie。
SESSION_COOKIE_PATH
设置为"/tmp"这看起来像是个错误,除非你的网络应用托管在"http://mydomain.com/tmp/"上。
SESSION_COOKIE_PATH
用于指示cookie的“路径”部分,也就是cookie将返回到服务器的URL前缀。这让你可以在"mydomain.com/firstapp/"上托管一个应用,在"mydomain.com/secondapp/"上托管另一个应用,并确保“sessionid”cookie不会混淆。如果你在这个域名下只有一个应用,那么把它留空,它会默认设置为"/"(整个域名)。
如果你想控制Django在文件系统上存储会话数据的位置(看起来你是想这么做),可以使用
SESSION_FILE_PATH
设置。默认情况下,它已经设置为"/tmp/",所以你不需要特别设置它。