当前位置: 首页 > 知识库问答 >
问题:

Django Rest框架删除csrf

澹台志诚
2023-03-14

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

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

共有3个答案

归鸿朗
2023-03-14

修改URL。派克

如果您在URL中管理路由。py,您可以使用csrf_emption()包装所需的路由,以将它们从csrf验证中间件中排除。

import views

from django.conf.urls import patterns, url
from django.views.decorators.csrf import csrf_exempt


urlpatterns = patterns('',
    url(r'^object/$', csrf_exempt(views.ObjectView.as_view())),
    ...
)

或者,作为一个装饰者,一些人可能会发现使用@csrf_豁免装饰者更适合他们的需要

例如,

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

应该把工作做完!

缪风史
2023-03-14

更简单的解决方案:

在views.py中,使用django大括号'CsrfExemptMixinauthentication_classes

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
from braces.views import CsrfExemptMixin


class Object(CsrfExemptMixin, APIView):
    authentication_classes = []

    def post(self, request, format=None):
        return Response({'received data': request.data})
须鸿祯
2023-03-14

为什么会发生这种错误?

发生这种情况是因为DRF使用了默认的Session身份验证方案。DRF的会话认证使用Django的会话框架进行认证,这需要检查CSRF。

如果在视图/视图集中未定义任何身份验证\u类,DRF将使用此身份验证类作为默认类。

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

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

如果您使用带有Session身份验证的AJAX样式API,则需要为任何不安全的HTTP方法调用包括有效的CSRF令牌,例如PUT、PATCH、POST或DELETE请求。

那怎么办呢?

现在要禁用csrf检查,您可以创建一个自定义身份验证类CsrfExemptSessionAuthentication,该类扩展自默认的SessionAuthentication类。在这个身份验证类中,我们将覆盖在实际的会话身份验证中发生的强制\u 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

在您的视图中,您可以将身份验证\u类定义为:

authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)

这应该可以处理csrf错误。

 类似资料:
  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 任何关于如何实现这一点的指示和/或文件都将不胜感激。

  • 问题内容: 我正在使用EF 4 STE对附件对象进行建模。该 附件 包含了名称,描述,日期,以及最重要的数据()。为了优化加载,我不想在绝对必要之前(即当用户从客户端单击时)检索Data属性。 为了遵循这种方法,我使用了此处描述的表拆分技术。我将“ 附件” 表分为“ 附件” (“名称”,“描述”,“日期”)和“ AttachmentData” (数据)。在我的EF模型中,这是一对一的关系。一切正常

  • 我们正在启动一个新应用程序。我们想使用实体框架。我们几乎不怕意外删除sql行(尤其是意外设置相关数据等) 我想禁用每一次删除,因为我们只是用“validUntil”列标记每一行,而从不删除行。 我看到它可以通过sql中的角色来完成,但我希望所有逻辑和控制都只在代码中。 也许在实体框架核心中有新的特性来支持这一点?我知道它仍然可以用EF编写行sql,但我们并不害怕这种情况。 我还尝试删除实体关系的s

  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 问题内容: 我正在尝试清除tkinter中的框架,以便可以写入新内容(刷新信息),但是我无法做到这一点。我知道这些 但是frame.destroy()会完全删除框架。另外两个也不能给我我想要的结果。我需要的只是 清除框架中的每个项目,但框架本身会保留下来 。反正有做吗? 问题答案: 并且只会从视图中删除小部件,不会破坏它们。如果您不打算重复使用这些小部件,那么唯一的选择就是使用方法销毁它们。 为此