暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Django:ModelViewSet「required positional argument: 'view'」

Nephilim 2024-05-29
112

Tips:一些记录,一些笔记



2024/05/29

WEDNESDAY

Difficult circumstances serve as a textbook of life for people.

困难坎坷是人们生活的教科书。



(图片来自:武汉市·莎县意式小馆)


01

报错详情


完整的报错信息如下所示:

    /Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/pagination.py:208: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'movie.models.Category'> QuerySet.
    paginator = self.django_paginator_class(queryset, page_size)
    [29/May/2024 18:50:52] "GET api/movie/2 HTTP/1.1" 301 0
    [29/May/2024 18:50:52] "GET api/category/ HTTP/1.1" 200 507
    [29/May/2024 18:50:52] "GET api/movie/2/ HTTP/1.1" 200 804
    Internal Server Error: api/collects/2/is_collected/
    Traceback (most recent call last):
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
    return view_func(request, *args, **kwargs)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/viewsets.py", line 124, in view
    return self.dispatch(request, *args, **kwargs)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 497, in dispatch
    self.initial(request, *args, **kwargs)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 415, in initial
    self.check_permissions(request)
    File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 332, in check_permissions
    if not permission.has_permission(request, self):
    TypeError: IsAuthenticated.has_permission() missing 1 required positional argument: 'view'
    [29/May/2024 18:50:52] "GET api/collects/2/is_collected/ HTTP/1.1" 500 96208



    02

    错误原因与解决方法


    在ModelViewSet中,重写「get_permissions」方法,返回具体策略函数的时候,没有带上括号,只返回了函数名。


    错误产生时的代码状态:


    修改后的正确代码:

      import requests


      from django.shortcuts import render
      from django.core.exceptions import ObjectDoesNotExist
      from django.http import HttpResponse


      from rest_framework import viewsets
      from rest_framework.response import Response
      from rest_framework.decorators import action


      from rest_framework.permissions import IsAuthenticated,IsAdminUser


      from movie.models import *
      from movie.serializers import *


      from account.models import *


      # Create your views here.


      def account_activate(request, uid, token):


      res = requests.post(
      url="http://127.0.0.1:8000/auth/users/activation/",
      data={
      "uid": uid,
      "token": token,
      }
      )
      print("返回的状态码「%s」" % res.status_code)


      if res.status_code == 204:
      return HttpResponse("账户「成功激活」")


      return HttpResponse("请确认「激活链接」的正确性")


      class CollectViewSet(viewsets.ModelViewSet):
      queryset = Movie.objects.all()
      serializer_class = MovieSerializer


      # 接口的权限控制
      # permission_classes = [
      # IsAuthenticated,
      # ]


      def get_permissions(self):
      if self.request.method in ['PUT','PATCH']:
      return [
      IsAdminUser(),
      ]
      return [IsAuthenticated()]


      def list(self, request):
      user = self.request.user
      print("「list」当前用户:%s" % user.username)


      profile = Profile.objects.get(user=user)


      movies = profile.movies.all()
      serializers = MovieSerializer(movies, many=True)


      return Response(serializers.data)


      def create(self, request):
      user = self.request.user
      print("「添加收藏」当前用户:%s" % user.username)


      profile = Profile.objects.get(user=user)


      # 需要提交的参数
      movie_id = request.data['movie_id']
      try:
      movie = Movie.objects.get(id=movie_id)
      profile.movies.add(movie)


      return Response({
      "status_code": 0,
      "message": "收藏成功"
      })
      except ObjectDoesNotExist:
      return Response({
      "status_code": 401,
      "message": "电影不存在"
      })
      except:
      return Response({
      "status_code": 400,
      "message": "收藏失败"
      })


      def destroy(self, request, pk):


      user = self.request.user
      print("「取消收藏」当前用户:%s" % user.username)


      profile = Profile.objects.get(user=user)


      try:
      movie = Movie.objects.get(id=pk)


      if movie not in profile.movies.all():
      return Response({
      "status_code": 402,
      "message": "未收藏该电影"
      })


      profile.movies.remove(movie)


      return Response({
      "status_code": 0,
      "message": "取消收藏成功"
      })
      except ObjectDoesNotExist:
      return Response({
      "status_code": 401,
      "message": "电影不存在"
      })
      except:
      return Response({
      "status_code": 400,
      "message": "取消收藏失败"
      })


      # detail: True - 以单一资源的形式展示
      # detail: False - 以集合资源的形式展示
      @action(detail=True, methods=['get'])
      def is_collected(self, request, pk=None):


      user = self.request.user
      print("「收藏状态判定」当前用户:%s" % user.username)
      print(type(request.user))


      try:
      profile = Profile.objects.get(user=user)
      except:
      return Response({
      "is_collected": False
      })


      movie = Movie.objects.get(id=pk)
      is_collected = profile.movies.filter(id=movie.id).exists()
      return Response({
      "is_collected": is_collected
      })






      END




      温馨提示



      如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。


      文章转载自Nephilim,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论