开发者社区> 问答> 正文

Django Rest框架删除csrf

我知道有关于Django Rest框架的答案,但是我找不到解决问题的方法。 我有一个应用程序,它具有身份验证和一些功能。 我添加了一个新的应用程序,它使用Django Rest框架。我想在这个app中使用这个库。我还想做POST请求,我总是收到这个响应:

{
    "detail": "CSRF Failed: CSRF token missing or incorrect."
}

我有以下代码:

# urls.py
from django.conf.urls import patterns, url


urlpatterns = patterns(
    'api.views',
    url(r'^object/$', views.Object.as_view()),
)

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt


class Object(APIView):

    @csrf_exempt
    def post(self, request, format=None):
        return Response({'received data': request.data})

我希望在不影响当前应用程序的情况下添加API。 我的问题是,如何禁用CSRF只针对这个应用程序? 问题来源StackOverflow 地址:/questions/59383973/django-can-we-enforce-post-request-in-drf-without-requiring-csrftoken

展开
收起
kun坤 2019-12-26 15:44:42 913 0
1 条回答
写回答
取消 提交回答
  • 为什么会发生这个错误? 这是因为DRF使用了默认的SessionAuthentication方案。DRF的SessionAuthentication使用Django的会话框架进行身份验证,这需要检查CSRF。 当您没有在视图/viewset中定义任何authentication_classes时,DRF使用这个身份验证类作为默认值。

    'DEFAULT_AUTHENTICATION_CLASSES'= (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ),
    

    由于DRF需要同时支持对相同视图的基于会话和非会话的身份验证,因此它强制只对经过身份验证的用户进行CSRF检查。这意味着只有经过身份验证的请求才需要CSRF令牌,匿名请求可以在没有CSRF令牌的情况下发送。 如果使用带有SessionAuthentication的AJAX风格的API,则需要为任何“不安全”的HTTP方法调用(如PUT、PATCH、POST或DELETE请求)包含有效的CSRF令牌。 那怎么办呢? 现在,要禁用csrf检查,您可以创建一个自定义身份验证类csrftsessionauthentication,它扩展自默认的SessionAuthentication类。在这个身份验证类中,我们将覆盖在实际SessionAuthentication中发生的强制执行_csrf()检查。

    from rest_framework.authentication import SessionAuthentication, BasicAuthentication 
    
    class CsrfExemptSessionAuthentication(SessionAuthentication):
    
        def enforce_csrf(self, request):
            return  # To not perform the csrf check previously happening
    

    在你的视图中,你可以定义authentication_classes为:

    authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)
    

    这应该可以处理csrf错误。

    2019-12-26 15:44:56
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载