1

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

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

我知道当我participant_label在 URL 中使用时,我可以避免使用sessionId-cookie。但是,我仍然有csrf_token-cookie。

你知道如何取消它吗?我听说django-cookieless应该是一个解决方案,但我不知道如何使用它。

4

2 回答 2

1

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

这项工作由两部分组成:

  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']

wheremyapp当然应该是您的应用程序的名称,并且middle只是您的文件的名称

部分 2. 手动删除CsrfViewMiddleware

  1. 在您的任何 oTree 应用程序中都应该有一个名为__init__.py Go 的文件并插入:
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' ]

你很高兴。

于 2021-01-30T18:25:08.427 回答
0

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

在中间.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
于 2021-01-30T20:35:29.410 回答