Django Rest Framework删除csrf

Django Rest Framework删除csrf

我知道有关于Django Rest Framework的答案,但我无法找到解决问题的方法。

我有一个具有身份验证和一些功能的应用程序。我添加了一个新的应用程序,它使用Django Rest Framework。我想只在这个应用程序中使用该库。我也想发出POST请求,我总是收到这个回复:

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

我有以下代码:

# urls.pyfrom django.conf.urls import patterns, url


urlpatterns = patterns(
    'api.views',
    url(r'^object/$', views.Object.as_view()),)# views.pyfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom django.views.decorators.csrf import csrf_exemptclass Object(APIView):

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

我想添加API而不影响当前的应用程序。所以我的问题是如何才能为此应用禁用CSRF?


喵喵时光机
浏览 1315回答 3
3回答

小唯快跑啊

为什么会出现这种错误?这是因为SessionAuthenticationDRF使用的默认方案。DRF SessionAuthentication使用Django的会话框架进行身份验证,需要检查CSRF。如果未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 or DELETE请求)包含有效的CSRF令牌。该怎么办?现在要禁用csrf检查,您可以创建一个CsrfExemptSessionAuthentication从默认SessionAuthentication类扩展的自定义身份验证类。在此身份验证类中,我们将覆盖enforce_csrf()实际内部发生的检查SessionAuthentication。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错误。
打开App,查看更多内容
随时随地看视频慕课网APP