在这里插入代码片# Django REST framwork的权限验证
一、用户是否登录
(1)判断用户是否登录;
permission_classes = (IsAuthenticated, )
注意:permission_classes设置的是:验证的是用户是否登录、用户是否可以操作该数据等的权限;
权限组合方式,目前支持:与&(and) 或|(or) 非~(not)
例如:permission_classes = (SecAdminPermission | AudAdminPermission,)
注意:使用元组 (SecAdminPermission | AudAdminPermission,)或列表[ SecAdminPermission | AudAdminPermission]都可以。
(2)设置用户认证方式;
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
注意:authentication_classes设置的是:用户可以通过哪种方式登录系统,例如:JWT或传统的用户名+密码方式登录。
具体代码如下:
from rest_framework.permissions import IsAuthenticated # 判断用户是否登录 from rest_framework_jwt.authentication import JSONWebTokenAuthentication # jwt用户认证 class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): """ list: 获取用户收藏列表 retrieve: 判断某个商品是否已经收藏 create: 收藏商品 delete: 取消收藏 """ # 权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) # 用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) # 定义通过哪个参数来定位实例 lookup_field = "goods_id" # 在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的 def get_queryset(self): """获取当前登录用户的收藏信息""" return UserFav.objects.filter(user=self.request.user) # 方法一:修改商品收藏数 # def perform_create(self, serializer): # """修改商品收藏数""" # instance = serializer.save() # goods = instance.goods # goods.fav_num += 1 # goods.save() # 动态设置序列化类 def get_serializer_class(self): if self.action == "list": return UserFavDetailSerializer elif self.action == "create": return UserFavSerializer return UserFavSerializer
二、用户是否对该数据有操作权限;
(1)自定义权限验证
前提:待验证对象有user字段;
from rest_framework import permissions # 权限判断:数据是不是属于当前登录用户 class IsOwnerOrReadOnly(permissions.BasePermission): """ Object-level permission to only allow owners of an object to edit it. Assumes the model instance has an `owner` attribute. """ def has_object_permission(self, request, view, obj): # 1 只读 # Read permissions are allowed to any request, # so we'll always allow GET, HEAD or OPTIONS requests. if request.method in permissions.SAFE_METHODS: # 是不是安全的访问方法 return True # 2 写权限 # Instance must have an attribute named `owner`. # return (obj.publisher if obj.publisher else self.fans )== request.user return obj.user== request.user # 判断当前数据是不是登录用户的数据
(2)在接口中,添加数据权限验证;
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): """ list: 获取用户收藏列表 retrieve: 判断某个商品是否已经收藏 create: 收藏商品 delete: 取消收藏 """ # 权限判断:IsAuthenticated表示是否已经登录,IsOwnerOrReadOnly表示数据是不是属于当前登录用户 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) # 用户认证:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) # 设置 lookup_field = "goods_id" # 在详细页面时,搜索goods_id来确认该商品有没有被收藏,是在当前用户下进行搜索的 def get_queryset(self): """获取当前登录用户的收藏信息""" return UserFav.objects.filter(user=self.request.user)
补充知识:django rest framework api授权与认证
djangorestf 官方文档 授权与认证教程
permissions.py
from rest_framework import permissions class IsOwnerOrReadOnly(permissions.BasePermission): ''' 常规的授权是 只有拥有者才能编辑它 ''' def has_object_permission(self, request, view, obj): # 读权限 向所有请求开放 # 所以我们总是允许get, head or options requests. if request.method in permissions.SAFE_METHODS: return True # 写权限 只给拥有者 return obj.owner == request.user
view.py
'''基于泛型类的视图''' from snippets.models import Snippet from snippets.serializers import SnippetSerializer, UserSerializer from rest_framework import generics from snippets.permissions import IsOwnerOrReadOnly from django.contrib.auth.models import User class UserList(generics.ListAPIView): ''' User表的列表api视图 查 增 操作 ''' queryset = User.objects.all() serializer_class = UserSerializer class UserDetail(generics.RetrieveDestroyAPIView): ''' User表的详情api视图 查 改 删操作 ''' queryset = User.objects.all() serializer_class = UserSerializer class SnippetList(generics.ListCreateAPIView): permission_classes = [permissions.IsAuthenticatedOrReadOnly] queryset = Snippet.objects.all() serializer_class = SnippetSerializer def perform_create(self, serializer): serializer.save(owner=self.request.user) class SnippetDetail(generics.RetrieveDestroyAPIView): # detail 所有人都能读,但是只有拥有者可以更改 # permissions.IsAuthenticatedOrReadOnly 表示没有认证的人有读的权限,认证的人有所有权限 # IsOwnerOrReadOnly 通过了前面的授权之后,还要通过这个授权 # 当所有的授权都通过的时候 所有的对象实例都返回true 表示授权通过 permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly] queryset = Snippet.objects.all() serializer_class = SnippetSerializer
总结:通过传递permission_classes 类变量 传递授权类,
1、请求要进行某个操作的时候 ->
2、传递参数将授权类列表中的多个授权类实例化得到实例化对象->
3、调用所有授权实例对象的has_、permission以及has_object_permission方法 ->
4、所有的返回结果都为true ->
5、该操作的授权才通过,数据操作向下继续进行。
以上这篇Django REST framwork的权限验证实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]