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 804Internal 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 innerresponse = 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_responseresponse = 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_wrapperreturn 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 viewreturn 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 dispatchresponse = 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_exceptionself.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_exceptionraise excFile "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 497, in dispatchself.initial(request, *args, **kwargs)File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 415, in initialself.check_permissions(request)File "/Users/adamhuan/PycharmProjects/django_daily_media/venv/lib/python3.10/site-packages/rest_framework/views.py", line 332, in check_permissionsif 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 requestsfrom django.shortcuts import renderfrom django.core.exceptions import ObjectDoesNotExistfrom django.http import HttpResponsefrom rest_framework import viewsetsfrom rest_framework.response import Responsefrom rest_framework.decorators import actionfrom rest_framework.permissions import IsAuthenticated,IsAdminUserfrom 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.userprint("「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.userprint("「添加收藏」当前用户:%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.userprint("「取消收藏」当前用户:%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.userprint("「收藏状态判定」当前用户:%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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




