首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用oTree中的所有cookie

禁用oTree中的所有cookie
EN

Stack Overflow用户
提问于 2021-01-30 15:18:26
回答 2查看 113关注 0票数 1

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

我想将两者都禁用;但是,我不知道如何做到这一点。

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

你知道怎么解开它吗?我听说姜戈-无炊具应该是一个解决方案,但我不知道如何使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-30 18:25:08

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

这项工作由两部分组成:

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

不管怎么说。第1部分.编写自己的中间件

  1. 您可以在其中一个应用程序中创建一个python文件,比如middle.py。你在那里写的东西就像:
代码语言:javascript
复制
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中,您注册了中间件:

代码语言:javascript
复制
MIDDLEWARE = ['myapp.middle.DisableCSRFMiddleware']

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

第2部分.手动删除CsrfViewMiddleware

  1. 在任何oTree应用程序中,都应该有一个名为__init__.py的文件,转到那里并插入以下内容:
代码语言:javascript
复制
default_app_config = 'myapp.apps.MyAppConfig'
  1. 在您的应用程序(myapp)中创建一个名为apps.py的文件,并在其中插入以下内容:
代码语言:javascript
复制
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' ]

你可以走了。

票数 0
EN

Stack Overflow用户

发布于 2021-01-30 20:35:29

Philipp的答案可以调整为只删除参与者的个人电脑上的cookie。然后,管理界面仍将使用cookie。

在middle.py中:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65969643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档