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个赞
为什么会出现这种错误?
这是因为SessionAuthentication
DRF使用的默认方案。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错误。
添加回答
举报
0/150
提交
取消