Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Django';s@csrf_豁免修饰符以使API能够执行PUT?_Python_Django_Rest_Django Csrf - Fatal编程技术网

Python 如何使用Django';s@csrf_豁免修饰符以使API能够执行PUT?

Python 如何使用Django';s@csrf_豁免修饰符以使API能够执行PUT?,python,django,rest,django-csrf,Python,Django,Rest,Django Csrf,我正在用Django Rest框架API构建一个Django应用程序。我构建了一个API端点,如下所示 我希望能够从浏览器发布数据。我希望此POST操作从我的数据库中检索具有URL中给定的匹配主键的对象模型。我想根据浏览器发布的数据修改检索到的对象 如果我能用我的视图集从中获取发布的数据,我就完成了。但是当我尝试执行viewset的update()函数时,我得到了一个CSRF错误 从my URL.py文件: router.register(r'replyComment', views.Reply

我正在用Django Rest框架API构建一个Django应用程序。我构建了一个API端点,如下所示

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

如果我能用我的视图集从中获取发布的数据,我就完成了。但是当我尝试执行viewset的update()函数时,我得到了一个CSRF错误

从my URL.py文件:

router.register(r'replyComment', views.ReplyComment, base_name="replyComment")
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)
从my views.py文件:

router.register(r'replyComment', views.ReplyComment, base_name="replyComment")
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浏览器中使用高级Rest客户端(ARC)工具。当我将圆弧工具指向
http://127.0.0.1:3001/api/replyComment/2/
使用POST方法,我得到以下错误:

{
    detail: "CSRF Failed: CSRF token missing or incorrect". 
}
指示我应该使用
@csrf\u豁免
装饰器。我在上面的update()函数中添加了这个修饰符。但这似乎没有什么区别


我需要做哪些更改才能确保我的帖子按我的意愿工作?

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

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
),
并在ARC中启用基本身份验证。

可能的