# -*- coding: utf-8 -*- from rest_framework.permissions import BasePermission from rest_framework import exceptions import re from course.models import UserCourse # 自定义权限(局部) class MyPermission(BasePermission): # has_permission 是用户对这个视图有没有 GET POST PUT PATCH DELETE 权限的分别判断 def has_permission(self, request, view): print(‘has_perm‘) # print(view.kwargs.get("pk"), request.user.id) """判断用户对模型有没有访问权""" # 任何用户对使用此权限类的视图都有访问权限 if request.user.is_superuser: # 管理员对用户模型有访问权 return True elif view.kwargs.get(‘pk‘) == str(request.user.id): # 携带的id和用户的id相同时有访问权 return True return False # has_object_permission 是用户过了 has_permission 判断有权限以后,再判断这个用户有 没有对一个具体的对象有没有操作权限 # 这样设置以后,即使是django admin管理员也只能查询自己user标的信息,不能查询其他用户的 单条信息 def has_object_permission(self, request, view, obj): # 判断当前用户是否有访问 /course/sections/1/ 接口权限 course_detail_url = re.match(‘/course/sections/(\d+)/$‘, request.path_info) if course_detail_url: user = request.user course = obj.chapters.course has_video_rights = self.video_rights(user,course) return has_video_rights return True # 对用户是否有课程播放权限进行验证 @staticmethod def video_rights(user,course): ‘‘‘ :param user: 当前登录用户 :param course: 用户要播放的课程对象 :return: 返回True有权限,否则出发异常 ‘‘‘ # 1.免费课程直接返回True # 2.会员免费课程,判断当前用户是否是会员,如果是会员返回True # 3.付费课程,判断当前用户在UserCourse表中有购买记录返回True try: is_buy = UserCourse.objects.get(course=course, user=user) return True except Exception as e: raise exceptions.ParseError(‘没卖课程播放个毛线!头给你打扁!‘)
router.register(r‘sections‘, views.SectionsViewSet)
from utils.authentication import MyPermission
class SectionsViewSet(viewsets.ModelViewSet):
queryset = Sections.objects.all()
serializer_class = SectionsSerializer
permission_classes = (MyPermission,)
原文:https://www.cnblogs.com/SHHD/p/13962093.html