首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用Wagtail页面上的CSRF验证

禁用Wagtail页面上的CSRF验证
EN

Stack Overflow用户
提问于 2020-03-18 11:08:59
回答 2查看 607关注 0票数 3

我正试着在投币页上做个卷发请求。不幸的是我撞上了CSRF保护装置。

我试图使用@csrf_exempt装饰器在这个特定类型的页面上禁用CSRF,但没有成功。

下面是我的伪代码(许多调度中的一个):

代码语言:javascript
复制
@method_decorator(csrf_exempt, name='serve')
class NewsletterPage(MedorPage):

    class Meta:
        verbose_name = _("newsletter page")

似乎在调用serve方法之前就已经完成了csrf验证。

有什么想法吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-18 17:09:38

最后我对CSRF中间件进行了子类划分,如下所示:

代码语言:javascript
复制
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)
代码语言:javascript
复制
票数 0
EN

Stack Overflow用户

发布于 2020-03-18 11:26:44

您必须装饰wagtail.core.views.serve视图本身。由于这是不完整的,因为您希望将它的url保存在您的wagtail_urls中,所以您可以在包含wagtail url的任何地方执行以下操作:

代码语言:javascript
复制
# 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)),
    # ...
]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60738260

复制
相关文章

相似问题

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