繁体   English   中英

如何使用Django的@csrf_exempt装饰器来启用API进行PUT?

[英]How to use Django's @csrf_exempt decorator to enable an API to do PUT?

我正在使用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". 
}

该文档指示我应该使用@csrf_exempt装饰器。 我把那个装饰器放在上面的update()函数上。 但这似乎没有什么不同。

为了确保我的POST可以正常工作,我需要进行哪些更改?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM