如何使Django 2.1接受PATCH / DELETE请求

时间:2019-03-04 09:21:04

标签: django rest

我正在使用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(禁止)

1 个答案:

答案 0 :(得分:0)

错误代码403指示这是由于CSRF保护引起的。如the CSRF documentation所示,PUT和DELETE-以及POST-被认为是“不安全”的方法,因此Django禁止没有有效CSRF令牌的请求。

同一页面上有关于如何在Ajax请求中启用令牌的文档。另外,尽管强烈建议不要这样做,但是您可以在视图上使用@csrf_exempt装饰器来禁用保护。