当前位置: 首页 > 面试题库 >

Django Rest Framework移除CSRF

微生旻
2023-03-14
问题内容

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

我有一个具有身份验证和某些功能的应用程序。我向其中添加了一个新应用,该应用使用Django Rest Framework。我只想在此应用程序中使用库。我也想发出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?


问题答案:

为什么会发生此错误?

发生这种情况是由于SessionAuthenticationDRF使用默认方案。DRF SessionAuthentication使用Django的会话框架进行身份验证,该框架要求检查CSRF。

当你authentication_classes在视图/视图集中未定义任何对象时,DRF将此身份验证类用作默认身份验证类。

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

由于DRF需要对同一视图同时支持基于会话和基于非会话的身份验证,因此DRF仅对经过身份验证的用户强制执行CSRF检查。这意味着只有经过身份验证的请求才需要CSRF令牌,并且匿名请求可以在没有CSRF令牌的情况下发送。

如果你将AJAX样式的API与SessionAuthentication一起使用,则需要为任何“不安全的” 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错误。



 类似资料:
  • 不重复造轮子,是开发人员共同的哲学道理。在使用 Python 开发 RESTful Web API 时,就有一个大名鼎鼎的轮子 Django REST framework,这一节我们就来简单了解一下 Django REST framework。 Django REST framework 一听就是和著名的 Python web 开发框架 Django 有很大的关系,这个框架是由 Tom Chris

  • 大家早上好。我有以下代码: 问题是,uri变量被分配给RestTemplate构造函数为,也就是说,它从代码变量中删除初始的。

  • 问题内容: 为什么要使用一个来公开Django应用程序的API? 问题答案: TastyPie 正如Torsten所指出的那样,使用与令人敬畏的django-haystack相同的偷偷摸摸的东西写的东西不会出错。从我在邮件列表中看到的内容来看,Daniel Lindsey等人非常有帮助,Tastypie稳定,全面并且有据可查 出色的表现为你提供了一套明智的默认行为,并使使用这种样式的API的构建变

  • 问题内容: 如何从Python的字符串中删除所有HTML?例如,我该如何转向: 进入 谢谢! 问题答案: 您可以使用正则表达式删除所有标签:

  • 这就是我在教师实体中所拥有的: 现在我喜欢使用数据库的功能。重复一遍:数据库的删除级联功能只针对Student_Teacher-table! 问题是: 问题是:这很好,但是要触发删除中的条目,我必须在两边指定。Hibernate不解析,只看到,并将目标实体(和引用的学生)从缓存中删除,但它们仍然在数据库中!!!因此,我不得不在空降后彻底清除Hibernate期,重新阅读教师、傅太太、巴尔先生和学生

  • 我在馆长2.12.0中使用动物园管理员。 通过使用watcher调用getChildren(我事先不知道完整的节点路径),我成功地监视了新节点,watcher再次提交任务以调用getChildren with watcher。现在我想看节点移除和仅移除。我打电话给守望者。但如果节点由于某种原因不存在,它实际上将是节点创建的观察者,在我的例子中,这是永远不会发生的。因此,我将留下越来越多的“鞭打”观