Django(Python)会话ID问题

5 投票
2 回答
6528 浏览
提问于 2025-04-16 09:10

我在使用sessionid时遇到问题:request.session.session_key 每次刷新页面或提交表单时都会生成一个新的密钥。

而这个:request.COOKIES[settings.SESSION_COOKIE_NAME] 却提示找不到'sessionid'这个键。

我是不是漏掉了什么?我需要一个在我网站的页面请求之间能够保持不变的“密钥”。我希望它即使在关闭浏览器后或过了三周也能保持有效。我该如何在Django中实现这个?

我需要配置什么吗?如果我对sessionid的理解有误,或者对它是如何生成的有误,请纠正我。

谢谢大家的回复。

祝好,
W

我的settings.py文件是:http://pastebin.com/G9qnD9En

2 个回答

5

我遇到过类似的问题,我是通过把 SESSION_COOKIE_NAME 设置成一个不同于默认的 'sessionid' 的名字来解决的。我觉得可能是谷歌分析搞乱了这个 cookie。

9

听起来你的浏览器没有接受Django发送的会话cookie。

你的浏览器应该能告诉你,应用程序的页面响应中设置了哪些cookie。检查一下是否真的发送了一个名为'sessionid'的cookie,并且域名和路径是否正确。

如果你在settings.py文件中错误地设置了SESSION_COOKIE_DOMAINSESSION_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_DOMAINSESSION_COOKIE_PATH,以便与同一域名或相关域名上的其他网络应用良好互动。

编辑:

看了你粘贴的设置,我发现有两个不同的问题,每个问题都足以导致会话cookie无法正常工作。

  1. SESSION_COOKIE_DOMAIN设置为"mydomain.com"

    一个通用顶级域名的cookie要求“域名”部分至少包含两个句点(".")分隔符。这是为了防止人们为像".com"这样的域名设置cookie。(我相信,国家级管辖范围内的域名需要三个句点。)

    把这个改成".mydomain.com",浏览器就应该能返回这个cookie。

    在开发阶段(在你的本地机器上,地址是127.0.0.1),把这个设置留空,否则你的浏览器根本不会接受这个cookie。

  2. 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/",所以你不需要特别设置它。

撰写回答