禁用 oTree 中的所有 cookie
Disable all cookies in oTree
在 oTree 中,创建了两个 cookie:
sessionId
和 csrf_token
.
我想同时禁用这两个;但是,我不知道该怎么做。
我知道当我在 URL 中使用 participant_label
时,我可以避免 sessionId
-cookie。但是,我仍然有 csrf_token
-cookie。
你知道如何取消设置吗?我听说 django-cookieless 应该是一个解决方案,但我不知道如何使用它。
好吧,这有点不平凡。
为了在 Django(oTree 所基于的)中注入 csrftoken
,他们使用 CsrfViewMiddleware
。因此,如果它 将是 一个普通的 Django 项目,您只需从 settings.py
的 MIDDLWARE
参数中删除 CsrfViewMiddleware
。但不幸的是,oTree 通常以一种非常奇特的方式做事,这会使大多数人发疯,要做到这一点,您需要做一些工作。
本作品由两部分组成:
编写您自己的中间件,它将手动删除来自任何请求的所有 cookie。
在您的应用启动后手动删除 CsrfViewMiddleware
。你可能会问‘为什么第一部分还不够?因为显然 CsrfViewMiddleware 在您的中间件之后启动,即使您手动删除它,它仍然会注入一个 cookie。你可能会问为什么你需要 (1) 如果我们做 (2) - 我不确定答案,但我怀疑 oTree 另外注入一些其他 cookie(包括 csrf),所以如果你只是删除 CsrfViewMiddleware 那是不够的(我可能是错的)。
总之。 第 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
- 在您的任何 oTree 应用程序中都应该有一个名为
__init__.py
的文件
去那里插入这个:
default_app_config = 'myapp.apps.MyAppConfig'
- 在您的应用 (
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' ]
你很高兴。
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
在 oTree 中,创建了两个 cookie:
sessionId
和 csrf_token
.
我想同时禁用这两个;但是,我不知道该怎么做。
我知道当我在 URL 中使用 participant_label
时,我可以避免 sessionId
-cookie。但是,我仍然有 csrf_token
-cookie。
你知道如何取消设置吗?我听说 django-cookieless 应该是一个解决方案,但我不知道如何使用它。
好吧,这有点不平凡。
为了在 Django(oTree 所基于的)中注入 csrftoken
,他们使用 CsrfViewMiddleware
。因此,如果它 将是 一个普通的 Django 项目,您只需从 settings.py
的 MIDDLWARE
参数中删除 CsrfViewMiddleware
。但不幸的是,oTree 通常以一种非常奇特的方式做事,这会使大多数人发疯,要做到这一点,您需要做一些工作。
本作品由两部分组成:
编写您自己的中间件,它将手动删除来自任何请求的所有 cookie。
在您的应用启动后手动删除
CsrfViewMiddleware
。你可能会问‘为什么第一部分还不够?因为显然 CsrfViewMiddleware 在您的中间件之后启动,即使您手动删除它,它仍然会注入一个 cookie。你可能会问为什么你需要 (1) 如果我们做 (2) - 我不确定答案,但我怀疑 oTree 另外注入一些其他 cookie(包括 csrf),所以如果你只是删除 CsrfViewMiddleware 那是不够的(我可能是错的)。
总之。 第 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
- 在您的任何 oTree 应用程序中都应该有一个名为
__init__.py
的文件 去那里插入这个:
default_app_config = 'myapp.apps.MyAppConfig'
- 在您的应用 (
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' ]
你很高兴。
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