[英]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.