gpt4 book ai didi

django - 如何清除 Django 中旧 SESSION_COOKIE_DOMAIN 的 cookie

转载 作者:行者123 更新时间:2023-12-04 17:36:57 30 4
gpt4 key购买 nike

我们最近将 cookie 域 (settings.SESSION_COOKIE_DOMAIN) 从 domain.com 更改为 .domain.com,这阻止了 Safari 用户登录,除非他们清除了他们的 cookie。问题的根源在于为两个域都设置了 sessionid cookie。

有没有办法清除或忽略原始域,或者是建议用户清除 cookie 的唯一方法?

最佳答案

这可能发生在 SESSION_COOKIE_DOMAIN设置被修改。 (您说 SESSION_COOKE_PATH 已更改)。

SESSION_COOKIE_DOMAIN 的文档带有此警告:

SESSION_COOKIE_DOMAIN

Be cautious when updating this setting on a production site. If you update this setting to enable cross-domain cookies on a site that previously used standard domain cookies, existing user cookies will be set to the old domain. This may result in them being unable to log in as long as these cookies persist.



如果您从以下位置出发,则会发生这种情况:
SESSION_COOKIE_DOMAIN = None


SESSION_COOKIE_DOMAIN = '.domain.com'

正如您所说,现在客户端有两个 cookie,它们将在请求期间发送到服务器,两个 cookie 都名为 sessionid .当 Django 查看 cookie 时,它​​只能访问 Python 字典,所以它只能看到一个 sessionid cookie 而不是两者都发送。

我还没有测试过这个,但解决问题的一些想法可能是:
  • 要求用户删除相应的 cookie。根据用户数量和他们的技能水平,这可能不是一个合理的选择。要求他们删除所有 cookie 可能是不可能的。
  • 等待旧 cookie 过期。默认情况下,它看起来好像 sessionid cookie 有 14 天的有效期。一旦旧的 session cookie 过期,它们将不再随每个请求一起发送,从而允许新的 sessionid cookie 生效。
  • 更改名称 sessionid cookie 并编写一个自定义的 Django 中间件来处理旧的和新的 sessionid cookies 。

  • 我还没有测试最后一点,但应该可以更改 SESSION_COOKIE_NAME 除了 sessionid .现在,这将阻止现有的登录用户使用他们现有的 sessionid cookie,因此您需要编写一个能够处理 sessionid 的自定义中间件 cookies (用于旧 cookies )和 sessionidnew当前登录的 cookie。

    像这样的事情会起作用:
    from django.utils.importlib import import_module
    from django.contrib.sessions import middleware
    from django.conf import settings

    class MySessionMiddleware(middleware.SessionMiddleware):
    def process_request(self, request):
    engine = import_module(settings.SESSION_ENGINE)
    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
    if session_key is None:
    # Look for old cookie in request for auth purposes.
    session_key = request.COOKIES.get('sessionid', None)
    request.session = engine.SessionStore(session_key)

    您必须更换 SessionMiddlewaresettings.pyMIDDLEWARE_CLASSES使用这个新的中间件。例如:更改 'django.contrib.sessions.middleware.SessionMiddleware''custommiddleware.MySessionMiddleware'其中 custommiddleware.py 是具有上述代码的文件,并且存在于您的项目根文件夹中(存在 manage.py 文件)

    一旦足够的时间过去了,您就会满意所有旧的 sessionid cookie 已过期,您可以反向操作并改回使用 sessionid作为 session 的首选 cookie 名称,最终删除了可以处理两种不同类型 sessionid 的专家代码曲奇饼。

    关于django - 如何清除 Django 中旧 SESSION_COOKIE_DOMAIN 的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625569/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com