首页 > 解决方案 > Django:根据域设置不同的 SESSION_COOKIE_DOMAIN

问题描述

我对不同的域使用相同的 Django 项目。有些是子域,有些是完全不同的域,所以我让这些域运行同一个 Django 站点:

由于与此查询无关的原因,我不使用站点框架,并且我settings.py对所有站点都有一个,我想维护它。

当有人登录子域时,我希望他们也登录到任何其他子域。事实上,如果可能的话,我希望他们也能登录到其他站点,但我怀疑这是可能的。为了实现同时登录所有子域,我在settings.py中设置了如下变量:

SESSION_COOKIE_DOMAIN=".example1.com"

这就像宣传的那样工作,登录现在可以在不同的站点上使用。但是,我无法再登录任何其他域(我假设 cookie 是为错误的域设置的,因此无法正确识别)。我认为我应该做的是以某种方式设置SESSION_COOKIE_DOMAIN.example1.com在主站点上或.example2.com在其他站点上时。但是如何实现呢?

是一个类似的问题,这个答案似乎通过轻量级解决方案完成了我正在寻找的事情。但是,这是为较旧的 Django 版本编写的。我尝试为 Django 3 重写它,如下所示:

class CrossDomainSessionMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        try:
            if request.COOKIES:
                host = request.get_host()
                # check if it's a different domain
                if host not in settings.SESSION_COOKIE_DOMAIN:
                    domain = ".{domain}".format(domain=host)
                    for cookie in request.COOKIES:
                        if "domain" in request.COOKIES[cookie]:
                            request.cookies[cookie]['domain'] = domain
        except:
            pass
        return self.get_response(request)

但这似乎不起作用。这个条件:

if "domain" in request.COOKIES[cookie]:

简直是没见过面。不知道我应该改变什么。

标签: pythondjangocookiescross-domain

解决方案


推荐阅读