【问题标题】:Disable all cookies in oTree禁用 oTree 中的所有 cookie
【发布时间】:2021-05-04 06:26:27
【问题描述】:

在 oTree 中,创建了两个 cookie: sessionIdcsrf_token

我想禁用两者;但是,我不知道该怎么做。

我知道当我在 URL 中使用participant_label 时,我可以避免sessionId-cookie。不过,那我还有csrf_token-cookie。

你知道如何取消它吗?听说django-cookieless应该是个解决办法,但是不知道怎么用。

【问题讨论】:

    标签: cookies otree


    【解决方案1】:

    好吧,这有点不重要。 为了在 Django(oTree 所基于)中注入csrftoken,他们使用CsrfViewMiddleware。因此,如果它将是一个普通的 Django 项目,您只需从您的settings.py 中的MIDDLWARE 参数中删除CsrfViewMiddleware。但不幸的是,oTree 通常会以一种非常奇特的方式做事,这会让大多数人发疯,而要做到这一点,您需要做一些工作。

    这项工作由两部分组成:

    1. 编写您自己的中间件,从任何请求中手动删除所有 cookie。

    2. 在您的应用启动后手动删除CsrfViewMiddleware。你可能会问‘为什么第一部分还不够?因为显然 CsrfViewMiddleware 在你的中间件之后启动,即使你手动删除它,它仍然会注入一个 cookie。你可能会问为什么需要 (1) 如果我们需要 (2) - 我不确定答案,但我怀疑 oTree 还注入了一些其他 cookie(包括 csrf),所以如果你只是删除 CsrfViewMiddleware 那还不够(我可能是错的)。

    无论如何。 第 1 部分。编写自己的中间件

    1. 您在其中一个应用程序中创建了一个 python 文件,比如说middle.py。 你在那里写了这样的东西:
    class DisableCSRFMiddleware(object):
    
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            setattr(request, '_dont_enforce_csrf_checks', True)
    
            response = self.get_response(request)
            for cookie in request.COOKIES:
                response.delete_cookie(cookie)
            return response
    

    并在您的settings.py 中注册您的中间件:

    MIDDLEWARE = ['myapp.middle.DisableCSRFMiddleware']
    

    myapp 当然应该是你的应用程序的名称,middle 只是你的文件名

    第 2 部分。手动删除 CsrfViewMiddleware

    1. 在您的任何 oTree 应用程序中都应该有一个名为 __init__.py 的文件 去那里插入这个:
    default_app_config = 'myapp.apps.MyAppConfig'
    
    1. 在您的应用 (myapp) 中创建一个名为 apps.py 的文件并在其中插入以下内容:
    from django.apps import AppConfig
    from django.conf import settings
    
    
    class MyAppConfig(AppConfig):
        name = 'myapp'
    
        def ready(self):
            middleware = settings.MIDDLEWARE
            settings.MIDDLEWARE = [i for i in middleware if i != 'django.middleware.csrf.CsrfViewMiddleware' ]
    
    

    你可以走了。

    【讨论】:

    • 感谢您精心描述的代码。特别是告诉我代码的确切位置非常有帮助。
    【解决方案2】:

    Philipp 的回答可以调整为仅删除参与者 PC 上的 cookie。然后,管理界面仍将使用 cookie。

    在middle.py中:

    import re
    class DisableCSRFMiddleware(object):
    
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            setattr(request, '_dont_enforce_csrf_checks', True)
    
            pattern = re.compile("/p/")
            if pattern.search(request.META["PATH_INFO"]):
                for cookie in request.COOKIES:
                    response.delete_cookie(cookie)
                return response
            else:
                return response
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2022-12-05
      • 1970-01-01
      相关资源
      最近更新 更多