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