djanog / drf-删除方法

时间:2019-09-02 07:06:29

标签: django django-rest-framework permissions

我想从我的Likes表中删除点赞。为此,我从前端发出axios呼叫, axios({ method: "delete", url: http://127.0.0.1:8000/api/delete/ , params: { companyid: xyz } })

应该删除其中包含company_id = xyz的类似图片。

网址看起来像这样 path('delete/', DeleteLikesView.as_view()),/api/包含在项目的urls.py中。请注意...)

DeleteLikesView-

class DeleteLikesView(DestroyAPIView):
    queryset = Likes.objects.all()
    serializer_class = LikesSerializer


    def perform_destroy(self, request):
        print(self.kwargs['companyid'])
        companyid = self.kwargs['companyid']
        instance = Likes.objects.get(
            company_id=companyid, user_id=request.user.id)
        instance.delete()

我要么陷入错误403(csrf_token错误。尽管我尝试使用csrf_exempt,但没有运气)或不允许405方法(我将其称为this)。这个问题让我回到403错误)

感谢您的帮助。谢谢!

3 个答案:

答案 0 :(得分:0)

在请求中设置xsrfHeaderName,如下所示:

// ...
xsrfHeaderName: "X-CSRFToken",
// ...

在settings.py中添加CSRF_COOKIE_NAME

CSRF_COOKIE_NAME = "XSRF-TOKEN"

答案 1 :(得分:0)

您可以使用令牌身份验证而不是basicauth,如果使用令牌身份验证,则不会出现csrf错误。 你写了

instance = Likes.objects.get(company_id=companyid, user_id=request.user.id)

在上面的代码中,user_id = request.user.id无效,因为您尚未登录会话。您使用的是api,您需要提供一个令牌来告诉哪个用户正在访问api。

答案 2 :(得分:0)

您必须使用装饰类。 要修饰基于类的视图的每个实例,您需要修饰类定义本身。为此,您可以将修饰符应用于该类的 dispatch()方法。

from django.views.decorators.csrf import csrf_exempt

class DeleteLikesView(DestroyAPIView):
    ...

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)


    def perform_destroy(self, request):
        ...

查看更多信息: https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class