【问题标题】:Django/drf - delete methodDjango/drf - 删除方法
【发布时间】:2020-01-05 05:45:32
【问题描述】:

我想从我的Likes 表中删除喜欢的内容。为此,我正在从前端进行 axios 调用 axios({ method: "delete", url:http://127.0.0.1:8000/api/delete/, params: { companyid: xyz } })

应该删除里面有company_id = xyz的like。

网址看起来像这样 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 错误)

感谢任何帮助。谢谢!

【问题讨论】:

  • 您没有在请求中提供身份验证标头。
  • 我需要在那里提供 csrf 令牌或类似的东西吗?
  • 嗯,这取决于您使用的身份验证机制,例如基本认证、Oauth 等
  • 发布 urls.py,对于应用和项目的 url,发布回溯。

标签: django django-rest-framework permissions


【解决方案1】:

你必须使用装饰类。 要装饰基于类的视图的每个实例,您需要装饰类定义本身。为此,您将装饰器应用于类的 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

【讨论】:

    【解决方案2】:

    你可以使用token认证,而不是basicauth,如果你使用token auth,则不会出现csrf错误。 你写了

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

    在上面的代码中,user_id = request.user.id 将不起作用,因为你没有登录会话。你正在使用 api,你需要提供一个令牌来告诉哪个用户正在访问 api。

    【讨论】:

      【解决方案3】:

      在请求中设置 xsrfHeaderName 如下:

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

      在 settings.py 中添加 CSRF_COOKIE_NAME

      CSRF_COOKIE_NAME = "XSRF-TOKEN"
      

      【讨论】:

        猜你喜欢
        • 2014-12-29
        • 2017-07-24
        • 2016-02-17
        • 1970-01-01
        • 2021-09-23
        • 2016-10-11
        • 2011-03-29
        相关资源
        最近更新 更多