我正在使用Django 2.1构建应用程序,我希望能够通过ajax调用来执行PATCH / DELETE请求。通过对此进行研究,我发现解决方案是使用POST请求欺骗浏览器,但是将标头X_METHODOVERRIDE设置为所需的方法。
我将从创建一个可以解决此问题的中间件开始。最好的方法是什么?
请注意,我不想使用Django-REST
到目前为止发出DELETE请求的代码:
view.py
class CategoryManageView(StaffRequiredMixin, View):
model = Category
response_dict = {'status': False, 'text': '', 'data': {}}
def delete(self, request, *args, **kwargs):
cat = get_object_or_404(Category, request.POST['id'])
self.response_dict['data'] = cat
cat.delete()
self.response_dict['status'] = True
self.response_dict['text'] = 'Category deleted successfuly'
return JsonResponse(self.response_dict)
如果ajax调用方法设置为DELETE而不是POST或GET,则在控制台中出现错误:
删除http://127.0.0.1:8000/dashboard/admin/categories/manage 403(禁止)
答案 0 :(得分:0)
错误代码403指示这是由于CSRF保护引起的。如the CSRF documentation所示,PUT和DELETE-以及POST-被认为是“不安全”的方法,因此Django禁止没有有效CSRF令牌的请求。
同一页面上有关于如何在Ajax请求中启用令牌的文档。另外,尽管强烈建议不要这样做,但是您可以在视图上使用@csrf_exempt
装饰器来禁用保护。