为了账号安全,请及时绑定邮箱和手机立即绑定

Django Rest Framework删除csrf

Django Rest Framework删除csrf

喵喵时光机 2019-08-12 16:00:53
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?
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

为什么会出现这种错误?

这是因为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错误。


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 1321 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信