我有example.com和support.example.com。如果用户登录主站点,我希望可以从支持站点访问该会话。
将SESSION_COOKIE_DOMAIN设置为'.example.com'不是我想要的,因为我有许多其他带有django应用程序的子域,我不想访问该会话。
目前我唯一可以想象的解决方法是涉及棘手的重定向,如果有必要,我想避免使用。
有没有办法做到这一点?
答案 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。