在特定子域上共享django会话

时间:2010-09-18 17:20:10

标签: django session cookies

我有example.com和support.example.com。如果用户登录主站点,我希望可以从支持站点访问该会话。

将SESSION_COOKIE_DOMAIN设置为'.example.com'不是我想要的,因为我有许多其他带有django应用程序的子域,我不想访问该会话。

目前我唯一可以想象的解决方法是涉及棘手的重定向,如果有必要,我想避免使用。

有没有办法做到这一点?

6 个答案:

答案 0 :(得分:27)

解决方案是设置

SESSION_COOKIE_DOMAIN = '.example.com'

重命名会话cookie名称,例如

SESSION_COOKIE_NAME = 'examplesessionid'

在驱动两个子域的Django实例上。这两个站点将使用具有全局范围的重命名cookie,并且不会干扰其他Django实例,使用其各自子域上的默认“sessionid”cookie。

请注意,cookie 发送到example.com子域上的其他Django实例,但不会被解释为Django会话cookie。

答案 1 :(得分:5)

我最近在一个类似的问题中看到: How to get distinct Django apps on same subdomain to share session cookie?

建议使用django-cas进行单独会话但使用单点登录(您只能登录其中一个站点)。

答案 2 :(得分:2)

您可以编写自己的SessionMiddleware来根据域设置和检索Cookie。

基本上你想要复制现有的SessionMiddleware class。在process_request函数中查看域并检索正确的cookie以设置SessionStore。在process_response中,您需要为两个子域编写Cookie。在您的设置中,您将删除现有的SessionMiddleware类,并将其替换为您自己的类。

这只是我的头脑,所以如果它不起作用,不要恨我。祝您好运,请将您的发现发布给未来的读者。

答案 3 :(得分:0)

我不知道django,但是你可以设置2个饼干而不是1个吗?请参阅,仅当cookie域与url域匹配时才发送cookie?如果您希望在2个不同的域上拥有相同的会话,则可以设置2个具有相同值和不同域的cookie。在本例中为.example.com和support.example.com。因此,只有在获得其中一个时才会收到此cookie。

答案 4 :(得分:0)

以下值应该在所有django应用程序中相同

SESSION_COOKIE_DOMAIN = ".example.com"

SESSION_COOKIE_NAME = "anycookiename"

SECRET_KEY="anykey" 

如果您使用的是memcached,请在所有django应用程序中设置相同的memcached位置。

答案 5 :(得分:0)

我有多个域的应用程序,因此在settings.py中更改内容的解决方案对我来说并不好。所以我为主域设置了cookie:

# let's get our domain
arr = request.get_host().split(':')[0].split('.')
# if we are at subdomain page right now
# we should delete subdomain using:
# arr.pop(0)
domain = ".".join(arr)
response.set_cookie('city', 'somevalue, domain="."+domain)

此代码为域/ sudomain页面中的所有子域设置了cookie。