首页 > 解决方案 > 想要在openxx中为一个特定的post请求禁用CSRF

问题描述

在 openx 中,我使用 Xblock.json_handler 进行第三方 api 消费。但是我想为那个帖子 api 禁用 csrf 身份验证,有人可以帮我解决这个问题吗?

标签: pythondjangoopenedx

解决方案


他们有很多方法可以做到这一点。但是请记住,除非您想创建自己的自定义中间件,否则您不能在全局级别禁用 CSRF。见文档

1.) 使用 csrf_exempt 方法

如果您希望某些视图不使用 CSRF,可以使用@csrf_exempt。将@csrf_exempt添加到要禁用的每个视图

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return 'CSRF is disabled for this view'

2.) 使用 setting.py 配置

在 MIDDLEWARE 的 setting.py 中,您可以简单地删除/注释这行代码:

'django.middleware.csrf.CsrfViewMiddleware',

请记住 SessionAuthentication 执行它自己的 CSRF 验证。如果在使用 sessionAuthentication 时评论,这将触发 CSRF 丢失错误。

3.) Creating your own Custom Middleware

要在 Global 中禁用 CSRF,您可以编写自定义中间件,如下所示

from django.utils.deprecation import MiddlewareMixin

class DisableCsrfCheck(MiddlewareMixin):

    def process_request(self, req):
        attr = '_dont_enforce_csrf_checks'
        if not getattr(req, attr, False):
            setattr(req, attr, True)

然后添加这个类

yourApp_name.middlewarefilename.DisableCsrfCheck

MIDDLEWARE_CLASSES lists,

 django.middleware.csrf.CsrfViewMiddleware

推荐阅读