Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Wagtail页面上禁用CSRF验证_Python_Django_Csrf_Python Decorators_Wagtail - Fatal编程技术网

Python 在Wagtail页面上禁用CSRF验证

Python 在Wagtail页面上禁用CSRF验证,python,django,csrf,python-decorators,wagtail,Python,Django,Csrf,Python Decorators,Wagtail,我正试图在一个摇尾页面上做一个curl POST请求。不幸的是,我击中了CSRF 保护 我尝试使用@CSRF\u empture装饰程序在这种特定类型的页面上禁用CSRF,但没有成功 以下是我的伪代码(许多尝试之一): @method\u decorator(csrf\u豁免,name='service') 班级通讯页面(MedorPage): 类元: 详细名称=(“新闻稿页”) 似乎在调用service方法之前就已经完成了csrf验证 有什么想法吗 谢谢您必须装饰wagtail.core.v

我正试图在一个摇尾页面上做一个curl POST请求。不幸的是,我击中了CSRF 保护

我尝试使用
@CSRF\u empture
装饰程序在这种特定类型的页面上禁用CSRF,但没有成功

以下是我的伪代码(许多尝试之一):

@method\u decorator(csrf\u豁免,name='service')
班级通讯页面(MedorPage):
类元:
详细名称=(“新闻稿页”)
似乎在调用
service
方法之前就已经完成了csrf验证

有什么想法吗


谢谢

您必须装饰
wagtail.core.views.service
视图本身。由于这是不完整的,因为您希望将其url保留在
wagtail\u url
中,因此您可以在包含wagtail url的任何位置执行以下操作:

# urls.py

# ...
from wagtail.core import urls as wagtail_urls
# ...


### these two lines can really go anywhere ...
from wagtail.core import views
views.serve.csrf_exempt = True
### ... where they are executed at loading time

urlpatterns = [
    # ...
    re_path(r'^pages/', include(wagtail_urls)),
    # ...
]

这将适用于所有wagtail页面,而不仅仅是一种特定类型。

我最终将CSRF中间件子类化,如下所示:

from django.middleware.csrf import CsrfViewMiddleware

from wagtail.core.views import serve

from myproject_newsletter.models import NewsletterIndexPage


class CustomCsrfViewMiddleware(CsrfViewMiddleware):

    def process_view(self, request, callback, callback_args, callback_kwargs):

        if callback == serve:
            # We are visiting a wagtail page. Check if this is a NewsletterPage
            # and if so, do not perfom any CSRF validation
            page = NewsletterIndexPage.objects.first()
            path = callback_args[0]

            if page and path.startswith(page.get_url_parts()[-1][1:])
                return None

        return super().process_view(request, callback, callback_args, callback_kwargs)

非常感谢。这让我对wagtail的mecanism和csfr中间件有了更好的理解。不幸的是,正如你所说,这适用于所有的摇摆页。寻找一种有条件的方法,如果我找不到侵入性更小的东西,也许可以通过对csfr中间件本身进行子类化。看起来对你的目的很有希望。谢谢你的链接。它帮助解决了我的问题!