在oTree中,创建了两个cookie:sessionId和csrf_token。
我想将两者都禁用;但是,我不知道如何做到这一点。
我知道当我在URL中使用participant_label时,我可以避免使用sessionId-cookie。然而,我仍然拥有csrf_token-cookie。
你知道怎么解开它吗?我听说姜戈-无炊具应该是一个解决方案,但我不知道如何使用它。
发布于 2021-01-30 18:25:08
好吧,这有点不值一提。对于在Django中注入csrftoken ( oTree基于此),它们使用CsrfViewMiddleware。因此,如果这是一个普通的Django项目,您只需从CsrfViewMiddleware中的MIDDLWARE param中删除settings.py。但不幸的是,oTree通常以一种非常奇特的方式做事情,这会让大多数人发疯,要做到这一点,你需要做一些工作。
这项工作由两部分组成:
CsrfViewMiddleware。你可能会问‘为什么第一部分是不够的?因为很明显,CsrfViewMiddleware会在你的中间件之后启动,即使你手动删除它,它仍然会注入一个曲奇。你可能会问为什么你需要(1)如果我们要(2) --我不确定答案,但我怀疑oTree还注入了其他一些cookie (包括csrf),所以如果你只是删除CsrfViewMiddleware,那是不够的(我可能错了)。不管怎么说。第1部分.编写自己的中间件
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
__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' ]你可以走了。
发布于 2021-01-30 20:35:29
Philipp的答案可以调整为只删除参与者的个人电脑上的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 responsehttps://stackoverflow.com/questions/65969643
复制相似问题