【问题标题】:How to use Django's @csrf_exempt decorator to enable an API to do PUT?如何使用 Django 的 @csrf_exempt 装饰器来启用 API 执行 PUT?
【发布时间】:2014-03-10 19:51:10
【问题描述】:

我正在使用 Django-Rest-Framework API 构建一个 Django 应用程序。我已经构建了一个 API 端点,如下所示。

我希望能够从我的浏览器发布数据。我希望这个 POST 操作从我的数据库中检索一个对象模型,该模型具有 URL 中给定的匹配主键。我想根据浏览器发布的数据修改检索到的对象。

如果我可以用我的 ViewSet 抓取发布的数据,我就完成了。但是当我尝试执行该视图集的 update() 函数时,我得到了一个 CSRF 错误。

来自我的 urls.py 文件:

router.register(r'replyComment', views.ReplyComment, base_name="replyComment")

来自我的 views.py 文件:

class ReplyComment(viewsets.ViewSet):
    def update(self,request,pk=None):
        try: 
            origComment = Comment.objects.get(pk=pk)
            # Do something here that modifies the state of origComment and saves it.
            return Response(
                json.dumps(True), 
                status=status.HTTP_200_OK,
            )
        except Exception as exception:
            logger.error(exception)
            return Response(status=status.HTTP_400_BAD_REQUEST)

我在 Chrome 浏览器中使用 Advanced Rest Client (ARC) 工具。当我使用 POST 方法将 ARC 工具指向 http://127.0.0.1:3001/api/replyComment/2/ 时,出现以下错误:

{
    detail: "CSRF Failed: CSRF token missing or incorrect". 
}

This doc 表示我应该使用@csrf_exempt 装饰器。我把那个装饰器放在上面的 update() 函数上。不过好像没什么区别。

我需要进行哪些更改以确保我的 POST 按预期工作?

【问题讨论】:

标签: python django rest django-csrf


【解决方案1】:

强烈建议不要为会话身份验证禁用 CSRF 保护。这样做会使您的应用容易受到攻击。对于 API,DRF 仅对会话身份验证强制执行 CSRF 保护。如果您使用其他身份验证后端(Basic、Auth Token 或 OAuth),则无需请求 CSRF 令牌即可工作,因为 CSRF 攻击仅发生在浏览器中。现在,如果您的 API 将被非浏览器客户端使用,您可以启用其他身份验证后端之一。例如,使用基本身份验证:

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
),

并在 ARC 中启用基本身份验证。

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2023-03-16
    • 2013-03-15
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多