最新要闻
- 每日报道:本轮系列赛前两战,詹姆斯面对布鲁克斯防守打出14中7
- 不同档位DLSS对画面帧数的影响究竟有多大?看完秒懂|天天通讯
- 老人无牌无证驾驶老头乐从河南跑到江苏 还要周游全国
- 10分钟补能400km 理想首批4C超级充电站上线运营:女生也能拎得动-天天日报
- 腾讯起诉《王者荣耀》代练赢了:构成不正当竞争 获赔60万
- 马云被聘为香港大学荣誉教授:聘期三年|天天速看料
- 当前资讯!启动“盟圈”,开拓聚才引才“新阵地”
- 热文:推广央行数字货币,牙买加财政部出台激励计划
- 中国人民解放军陆军第九四七医院与咸阳职业技术学院签订校企合作协议 当前聚焦
- 每日快报!女子骑摩托车遇沉降路段摔倒遭碾压身亡 竟担主责:官方重申不服可上诉
- 世界百事通!致敬《流浪地球2》国内首个类ChatGPT模型MOSS正式开源
- 画面过度拟真被质疑造假:《Unrecord》官方发布引擎录像自证清白_百事通
- 华为回应孟晚舟要去美国出差传言:纯属造谣
- 传小鹏P7接亲车队开辅助驾驶连环追尾 小鹏回应:拿普通事故抹黑
- 贵州:一片茶叶走出的乡村振兴路-速递
- 环球看点!发现有检查“黑车”司机扔下车跑了 留下一车乘客发呆
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【快播报】DRF的权限组件(源码分析)
(资料图)
DRF的权限组件(源码分析)
1. 创建用户表
from django.db import models# Create your models here.class UserInfo(models.Model): role_choice = ((1, "CEO"), (2, "CTO"), (3, "CFO")) role = models.SmallIntegerField(verbose_name="类型", choices=role_choice, default=1) username = models.CharField(verbose_name="用户名", max_length=32) password = models.CharField(verbose_name="密码", max_length=32) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)
2. 自定义权限类
from rest_framework.permissions import BasePermissionclass PermissionA(BasePermission): message = {"code": 1003, "data": "无权访问"} def has_permission(self, request, view): if request.user.role == 2: return True return False def has_object_permission(self, request, view, obj): return True
3. 视图函数中添加认证
- 局部配置(views.py)
class UserView(APIView): permission_classes = [PermissionA, ] # role权限 def get(self, request): ...
- 全局配置(settings.py)
REST_FRAMEWORK = { # 权限 "DEFAULT_PERMISSION_CLASSES": ["app01.permission.PermissionA", ]}
4. 多个权限类
当开发过程中需要用户同时具备多个权限(缺一不可)时,可以用多个权限类来实现。
权限组件内部处理机制:按照列表的顺序逐一执行 has_permission
方法,如果返回True,则继续执行后续的权限类;如果返回None或False,则抛出权限异常并停止后续权限类的执行。
# models.pyfrom django.db import modelsclass Role(models.Model): """ 角色表 """ title = models.CharField(verbose_name="名称", max_length=32)class UserInfo(models.Model): """ 用户表 """ username = models.CharField(verbose_name="用户名", max_length=32) password = models.CharField(verbose_name="密码", max_length=64) token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True) roles = models.ManyToManyField(verbose_name="角色", to="Role")
# urls.pyfrom django.urls import path, re_path, includefrom app01 import viewsurlpatterns = [ path("api/auth/", views.AuthView.as_view()), path("api/order/", views.OrderView.as_view()),]
# views.pyimport uuidfrom rest_framework.views import APIViewfrom rest_framework.request import Requestfrom rest_framework.response import Responsefrom rest_framework.authentication import BaseAuthenticationfrom rest_framework.permissions import BasePermissionfrom rest_framework.exceptions import AuthenticationFailedfrom app01 import modelsclass AuthView(APIView): """ 用户登录认证 """ def post(self, request, *args, **kwargs): print(request.data) # {"username": "wupeiqi", "password": "123"} username = request.data.get("username") password = request.data.get("password") user_object = models.UserInfo.objects.filter(username=username, password=password).first() if not user_object: return Response({"code": 1000, "data": "用户名或密码错误"}) token = str(uuid.uuid4()) user_object.token = token user_object.save() return Response({"code": 0, "data": {"token": token, "name": username}})class TokenAuthentication(BaseAuthentication): def authenticate(self, request): token = request.query_params.get("token") if not token: raise AuthenticationFailed({"code": 1002, "data": "认证失败"}) user_object = models.UserInfo.objects.filter(token=token).first() if not user_object: raise AuthenticationFailed({"code": 1002, "data": "认证失败"}) return user_object, token def authenticate_header(self, request): return "Bearer realm="API""class PermissionA(BasePermission): message = {"code": 1003, "data": "无权访问"} def has_permission(self, request, view): exists = request.user.roles.filter(title="员工").exists() if exists: return True return False def has_object_permission(self, request, view, obj): return Trueclass PermissionB(BasePermission): message = {"code": 1003, "data": "无权访问"} def has_permission(self, request, view): exists = request.user.roles.filter(title="主管").exists() if exists: return True return False def has_object_permission(self, request, view, obj): return Trueclass OrderView(APIView): authentication_classes = [TokenAuthentication, ] permission_classes = [PermissionA, PermissionA] def get(self, request, *args, **kwargs): return Response({"code": 0, "data": {"user": None, "list": [1, 2, 3]}})class PayView(APIView): authentication_classes = [TokenAuthentication, ] permission_classes = [PermissionA, ] def get(self, request, *args, **kwargs): return Response({"code": 0, "data": "数据..."})
5. 关于has_object_permission
后期补充...
6. 源码分析
第三步前面的部分执行流程和前两篇文章是一样的. 这里就不过多赘述了
关键词:
-
【快播报】DRF的权限组件(源码分析)
DRF的权限组件(源码分析)1 创建用户表fromdjango dbimportmodels Createyourmodelshere classUserInfo(model
来源: 全球速看:打好软件国产化攻坚战,闪信科技面向人工智能和数字经济进行新一代升级
【快播报】DRF的权限组件(源码分析)
物联网常见协议之Amqp协议及使用场景解析 当前报道
每日报道:本轮系列赛前两战,詹姆斯面对布鲁克斯防守打出14中7
【财经分析】聚焦可持续转型升级 绿色债券领域蓬勃发展
【财经分析】供需趋松压力增大 铁矿石大幅下挫-全球观察
不同档位DLSS对画面帧数的影响究竟有多大?看完秒懂|天天通讯
老人无牌无证驾驶老头乐从河南跑到江苏 还要周游全国
10分钟补能400km 理想首批4C超级充电站上线运营:女生也能拎得动-天天日报
腾讯起诉《王者荣耀》代练赢了:构成不正当竞争 获赔60万
马云被聘为香港大学荣誉教授:聘期三年|天天速看料
全球即时看!项目播报 | 璞华×江苏鼎为云,打造数字化“采云链”体系,赋能新能源机电行业生态化
环球关注:Excel的列数如何用数字表示?
WCF教程_编程入门自学教程_菜鸟教程-免费教程分享 每日速看
当前资讯!启动“盟圈”,开拓聚才引才“新阵地”
热文:推广央行数字货币,牙买加财政部出台激励计划
中国人民解放军陆军第九四七医院与咸阳职业技术学院签订校企合作协议 当前聚焦
每日快报!女子骑摩托车遇沉降路段摔倒遭碾压身亡 竟担主责:官方重申不服可上诉
世界百事通!致敬《流浪地球2》国内首个类ChatGPT模型MOSS正式开源
画面过度拟真被质疑造假:《Unrecord》官方发布引擎录像自证清白_百事通
华为回应孟晚舟要去美国出差传言:纯属造谣
传小鹏P7接亲车队开辅助驾驶连环追尾 小鹏回应:拿普通事故抹黑
贵州:一片茶叶走出的乡村振兴路-速递
环球看点!发现有检查“黑车”司机扔下车跑了 留下一车乘客发呆
【GPT开发】人人都能用ChatGPT4.0做Avatar虚拟人直播
浅谈日出日落的计算方法以及替代工具 - 日出日落 API-精彩看点
这款产品,竟然用了二千多年才爆火?|世界最资讯
当前焦点!比亚迪李云飞:比亚迪今年要卖300万台车
德国玩家竟如此钟爱AMD显卡!销量超过NVIDIA几乎20% 每日速讯
青岛国家深远海绿色养殖试验区养殖鱼类首次成功度夏-天天快讯
环球观点:尚无特效药!国产带状疱疹疫苗全国接种启动:一针能管10年
半价手慢无:卜珂巧克力夹心蛋卷14.9元/3罐 速递
电影情节成真!加拿大机场1.6吨黄金被盗 价值超亿美元_世界快讯
上演“史诗级灾难公关”:宝马蒸发市值可买约5亿个冰淇淋
可以再等等!iQOO 12系列在路上:200W超快闪充-天天新资讯
香菜饼最简单的做法,只需一把香菜,2个鸡蛋!
焦点热门:AIGC的阿克琉斯之踵
超过50多个热门的免费可用 API 分享|滚动
火山引擎 DataTester 3 大功能升级:聚焦敏捷、智能与易用,帮助企业降本增效
天天热讯:三峡艺术高中分数线(三峡艺术高中)
新华指数|钢“财”说:库存延续下行,基本面仍待改善|今日要闻
环球热点!长峰医院火灾系医院内部施工引燃可燃涂料所致
榴莲批发价1斤低至20元:海南国产榴莲也快上市了
2023新款超轻超弹:匹克轻弹风逸跑鞋119元狂促(原价249元)
《惊奇队长2》创纪录!62万踩成漫威最讨人厌的预告
男子被贴膏药秒倒地 官方通报:涉事膏药无迷药成分
驾驶舱可变大床!五菱龙卡本月上市:横竖都能拉
天语e66怎么开机?天语e66手机可以拍视频吗?
华为T8951什么时候上市的?华为T8951手机参数
中兴v987是什么型号?中兴V987手机参数
七月未央作者_七月未央
三星S3850如何恢复出厂设置?三星S3850手机参数
摩托罗拉MT620上市价格是多少?摩托罗拉MT620手机参数
C#写一套最全的SQL server帮助类(包括增删改查)
秦都区吴办吴家堡社区新时代文明实践站开展党建引领 “童”行同乐活动
热点!110万的比亚迪大把人买!仰望U8预售48小时:订单已超1.3万份
NVIDIA大失所望:RTX 4070卖崩了!AMD成市场赢家
天天资讯:用户自驾突发紧急情况!最后用华为P60 Pro获救:用一次续一生
五一假期十大热门城市:看看有你想去的吗?
升空后人工引爆!下次再来 成功三分之一的Starship 新动态
长安C401将被称为长安辛特克斯动力来自马自达1.6 天天微资讯
JS中的进程和线程-动态
linux下查看文件内容工具发布啦!
04 设置工作模式与环境(下)收集信息
天天速讯:全国首单绿色及能源保供双主题ABS在深交所完成发行
环球速讯:园企智推官“我为企业代言”推介大赛开启
全球通讯!苹果版余额宝收益4%?我可一点都不羡慕 背后有猫腻
世界视讯!你信吗?宝马MINI再道歉:吃冰淇淋的“老外”是同事 求宽容2位小姐姐
1499元起!荣耀X50i手机发布:标配256GB超大存储
环球快资讯:我国天文学家为银河系精确“称重”:约为8050亿个太阳质量
高速上惊现喷气式汽车 车尾一路滚滚浓烟 涡轮增压器坏了
海南省白沙县2023-04-20 12:36发布雷电黄色预警
MYSQL---主从同步概述与配置
Docker基础知识和命令使用入门
网络流的C++代码实现与过程讲解
每日关注!南昌大学举办潘际銮教育思想研讨会
伛偻提携往来而不绝者滁人游也翻译_伛偻提携_焦点热文
嫁入豪门?前世界首富目不转睛盯着谷爱凌,搂着爱凌合影很兴奋
绿色转型湾区“债”持续——中央结算公司2023年二季度债市研判六人谈举行
“星级酒店”旅游专列今日发车:双人大床房 24小时管家
暗黑4再次公测
当前速读:上海一商场特斯拉展车喇叭响不停 销售员束手无策 路人纷纷堵耳
华为实现自主可控的MetaERP研发:我们已经突破封锁 我们活了下来-环球速看
环球即时:德国男单全军覆没!世界冠军1:3输球,世界第六现场脱衣服换球服
双鱼座今日运势_双鱼座男生讨厌女生_今日看点
四大证券报精华摘要:4月21日
仰望U8市区上路 体型硕大:一旁70万的途锐秒变高尔夫
马斯克不止星舰发射失败 特斯拉暴跌近10%:市值一夜蒸发3780亿元
全球视讯!剧情够毁灭!漫威宣布《复仇5》 明年开拍:国人不爱看 不符合文化观?
世界速递!2399元起加量还减价!小米平板6 Pro今日首销:升级神U骁龙8+
探访风波中的宝马mini展台
读SQL进阶教程笔记13_SQL中的分组和层级
笔趣阁校花的贴身高手小说_笔趣阁校花的贴身高手 每日简讯
超预期!世界打开中国经济“一季报”的正确姿势
北京军地检察机关推动监管部门加强保护管理
【环球新要闻】提前感知这次“五一”假期有多火:酒店预订量涨4倍、淄博订单涨20倍
KMeans_世界观热点
全球热点!Rust编程语言入门之Rust的面向对象编程特性
【Visual Leak Detector】源码下载 世界热讯
【全球报资讯】手机系统相册在哪里(手机系统相册在哪里打开)