我知道有关于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
为什么会发生这个错误? 这是因为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错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。