最新要闻
- 宗申新款电动车闪电侠发布:续航超200公里 仪表盘可手机投屏
- 环球观速讯丨丢失两年的手机半夜仍被人试图解锁 被系统远程拍下照片
- 网友吐槽快递派送延误 韵达总部:人手紧张正调配
- 《狂飙》蜚声海外 英国小伙们沉迷剧集无法自拔:竟被打斗画面吸引
- 今日热文:大货车实线变道 女子科三被别停挂科当场发飙
- 全球热消息:土耳其一城市震后被海水倒灌:汽车泡在水里
- 环球观焦点:漂浮在数万米高空 你见到的“不明飞行物”:很可能就是一只气球
- 一加Ace 2支持双频GPS:发布会上没讲 结果被很多网友误伤
- 【天天播资讯】太火爆!ChatGPT多次因访问量激增而宕机
- 要闻:14年了:“千年老二”微软终于有机会扳倒谷歌搜索
- 热消息:微星推出Cubi 5 12M迷你主机:仅0.66L、配备双网口
- 世界热点评!女生应聘被问是否单身!当事公司:要求单身正常 将起诉举报者
- 【全球时快讯】近50年来首次!日本沙滩惊现大量沙丁鱼 原因未知:开排核废水、也要大地震?
- 最新资讯:国产车开门红:1月比亚迪称王 大众沦落第三 合资腰斩
- 当前报道:自研指令集没有侵权MIPS 国产CPU龙芯赢了:摆脱官司
- 当前讯息:自燃车辆引燃邻车 损失谁来赔?法院释疑
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
消息!drf认证/权限/频率/分页-过滤-排序
(资料图)
内容概要
路由系统
认证组件
权限组件
频率组件
过滤/排序
分页组件
路由系统
1.自动生成路由
drf 由于继承ViewSetMixin类,路由写法变了-原生+drf,以后的路由写法,可能会有如下情况(三种情况) 1.-path("books/", views.BookView.as_view() 2.-path("books/", views.BookView.as_view({"get": "list", "post": "create"})) 3.-自动生成# drf提供了两个路由类,继承ModelViewSet后,路由可以自动生成 # 使用步骤: # 第一步:导入路由类 from rest_framework.routers import SimpleRouter,DefaultRouter # 第二步,实例化得到对象(两个类,一般使用SimpleRouter) router = SimpleRouter() # 第三步:注册:router.register("books", views.BookView, "books") # 第四步:在urlpatterns中注册,两种方式 1.-urlpatterns += router.urls 2.-include:path("/api/v1/", include(router.urls)) 方式多一些 # 底层实现:自动生成路由就 -本质是自动做映射,能够自动成的前提是,视图类中要有 5个方法的某几个或多个 get--->list get---->retrieve put---->update post---->create delete---->destory -ModelViewSet,ReadOnlyModelViewSet可以自动生成 -9个试图子类+配合ViewSetMixin 才可以自动生成 -GenericAPIView+5个试图扩展类+配合ViewSetMixin 才能自动生成
2.action装饰器
# action 装饰器是写在视图类的方法上,可以自动生成路由# 使用步骤1.写在视图类方法上 class SendView(ViewSet) # methods指定请求方法,可以传多个 # detail:只能传True和False -False,不带id的路径:send/send_sms/ -True,带id的路径:send/2/send_sms/ #url_path:生成send后路径的名字,默认以方法名命名 # url_name:别名,反向解析使用,了解即可 @action(methods=["POST"], detail=False) def send_sms(self, request):# 以后看到的drf路由写法后期,都是自动生成,一般不在urlpatterns 加入路由了 # action 写在视图类的方法上,可以自动生成路由# 使用步骤- 1 写在视图类方法上 class SendView(ViewSet): # methods指定请求方法,可以传多个 # detail:只能传True和False -False,不带id的路径:send/send_sms/ -True,带id的路径:send/2/send_sms/ # url_path:生成send后路径的名字,默认以方法名命名 # url_name:别名,反向解析使用,了解即可 @action(methods=["POST"], detail=False) def send_sms(self, request): # 以后看到的drf路由写法后期,都是自动生成,一般不在urlpatterns 加入路由了 # 补充:-1 不同请求方式可以使用不同序列化类 -2 不同action使用不同序列化类class SendView(GenericViewSet): queryset = None serializer_class = "序列化类" def get_serializer(self, *args, **kwargs): if self.action=="lqz": return "某个序列化类" else: return "另一个序列化列" @action(methods=["GET"], detail=True) def send_sms(self, request,pk): print(pk) # 手机号,从哪去,假设get请求,携带了参数 phone = request.query_params.get("phone") print("发送成功,%s" % phone) return Response({"code": 100, "msg": "发送成功"}) @action(methods=["GET"], detail=True) def lqz(self,request): # get # 序列化类 pass @action(methods=["GET"], detail=True) def login(self,request): # get # 序列化类 pass
认证组件
1.认证组件使用步骤
# 1 写一个认证类,继承BaseAuthentication# 2 重写authenticate方法,在该方法在中实现登录认证:token在哪带的?如果认证它是登录了# 3 如果认证成功,返回两个值【返回None或两个值】# 4 认证不通过,抛异常AuthenticationFailed# 5 局部使用和全局使用-局部:只在某个视图类中使用(当前视图类管理的的所有接口) class BookDetailView(ViewSetMixin, RetrieveAPIView): authentication_classes = [LoginAuth] -全局:全局所有接口都生效(登录接口不要) REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES":["app01.authenticate.LoginAuth"]} -局部禁用: class BookDetailView(ViewSetMixin,RetrieveAPIView): authentication_clsses = []
# 视图类# 查询所有class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer# 查询单个class BookDetailView(ViewSetMixin, RetrieveAPIView): queryset = Book.objects.all() serializer_class = BookSerializer # authentication_classes = [LoginAuth] # 需要写一个认证类,需要咱们写# 认证组件 单独的authenticate.py文件编写from rest_framework.authentication import BaseAuthenticationfrom rest_framework.exceptions import AuthenticationFailedfrom app01 import modelsclass LoginAuth(BaseAuthentication): def authenticate(self, request): # 在这里实现认证,如果是登录的,继续往后走返回两个值,如果不是抛异常 # 请求中是否携带token,判断是否登录,放在地址栏中 token = request.query_params("token", None) if token: # 前端传入token了,去表中查,如果能查到,登录了,返回两个值[固定的:当前登录用户,token] user_token_obj = models.UserToken.objects.filter(token=token).first() if user_token_obj: return user_token_obj.user, token # 返回两个值[固定的:当前登录用户,token] # 没有登录抛异常 raise AuthenticationFailed("token验证失败") raise AuthenticationFailed("没有token") # 路由代码router.register("books", views.BookView, "books")router.register("books", views.BookDetailView, "books")
权限组件
# 即便登录成功了,有些接口,还是不能访问,因为没有权限# 登录后,有的接口有权限访问,有的没有权限访问# 查询单个和查询所有,都要登录才能访问----》全局认证-查询单个需要超级管理员才能访问 -查询所有,所有登录用户都能访问 # 权限是一个字段,在User表中,加入user_type字段
1.权限使用
# 1 写一个权限类,继承BasePermission# 2 重写has_permission方法,在该方法在中实现权限认证,在这方法中,request.user就是当前登录用户# 3 如果有权限,返回True# 4 没有权限,返回False,定制返回的中文: self.message="中文"# 5 局部使用和全局使用-局部:只在某个视图类中使用【当前视图类管理的所有接口】 class BookDetailView(ViewSetMixin, RetrieveAPIView): permission_classes = [CommonPermission] -全局:全局所有接口都生效 REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES": [ "app01.permissions.CommonPermission", ], } -局部禁用: class BookDetailView(ViewSetMixin, RetrieveAPIView): permission_classes = []
频率组件
# 控制某个接口访问频率(次数)# 查询所有接口,同一个ip一分钟只能访问5次
1.使用步骤
# 1 写一个频率类,继承SimpleRateThrottle# 2 重写get_cache_key方法,返回什么,就以什么做限制----》ip,用户id做限制# 3 配置一个类属性:scope = "book_5_m"# 4 在配置文件中配置 "DEFAULT_THROTTLE_RATES": { "book_5_m": "5/m", },# 5 局部使用和全局使用-局部:只在某个视图类中使用【当前视图类管理的所有接口】 class BookDetailView(ViewSetMixin, RetrieveAPIView): throttle_classes = [CommonThrottle] -全局:全局所有接口都生效 REST_FRAMEWORK = { "DEFAULT_THROTTLE_CLASSES": ["app01.throttling.CommonThrottle"], } -局部禁用: class BookDetailView(ViewSetMixin, RetrieveAPIView): throttle_classes = []
过滤排序
restful规范中,要求了,请求地址中带过滤条件5个接口中,只有一个接口需要有过滤和排序,就是"查询所有接口"举例: 查询 所有图书接口,查询以 红 开头的所有图书
内置过滤类的使用【继承GenericAPIView】
# 内置过滤类,必须继承GenericAPIView及其子类,才能使用这种方法---》配置过滤类的方式from rest_framework.filters import SearchFilter, OrderingFilterclass BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer# SearchFilter内置的,固定用法,模糊匹配# 就有过滤功能了,指定按哪个字段过滤filter_backends = [SearchFilter]# search_fields = ["name"] # 可以按名字模糊匹配search_fields = ["name","price"] # 可以按名字模糊匹配或价格模糊匹配
自定义过滤类实现过滤
# 查询价格大于100的所有图书http://127.0.0.1:8000/api/v1/books/?price_gt=100 #第一步; 定义一个过滤类,继承BaseFilterBackend,重写filter_queryset方法class CommonFilter(BaseFilterBackend): def filter_queryset(self, request, queryset, view): # 在里面实现过滤,返回qs对象,就是过滤后的数据 price_gt = request.query_params.get("price_gt", None) if price_gt: qs = queryset.filter(price__gt=int(price_gt)) return qs else: return queryset # 第二步:配置在视图类上from app01 import filterclass BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [filter.CommonFilter] # 可以定制多个,从左往右,依次执行
使用第三方djagno-filter实现过滤
# 安装:django-filter# 下载了django-filter需要重新安装以下django2.22版本 他会自动升级django至4.x版本from django_filters.rest_framework import DjangoFilterBackendclass BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer permission_classes = [] authentication_classes = [] throttle_classes = [] filter_backends = [DjangoFilterBackend] filterset_fields = ["name","price"] # 支持完整匹配 name=聊斋11&price=933 # 支持的查询方式http://127.0.0.1:8000/api/v1/books/?price=939
排序使用
# 内置的就够了class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [OrderingFilter] ordering_fields = ["price"] # filter_backends = [OrderingFilter,filter.CommonFilter] # 可以定制多个,从左往右,依次执行 # ordering_fields = ["price"]# 支持的查询方法: http://127.0.0.1:8000/api/v1/books/?ordering=price http://127.0.0.1:8000/api/v1/books/?ordering=-price http://127.0.0.1:8000/api/v1/books/?ordering=-id,price
分页使用
# 分页,只有查询所有接口,才有分页# drf内置了三个分页器,对应三种分页方式#内置的分页类不能直接使用,需要继承,定制一些参数后才能使用
自定义一个分页类
# 分页使用,自定义一个分页类(三种)class CommonPageNumberPagination(PageNumberPagination): page_size = 2 # 每页显示2条 page_query_param = "page" # page=10 查询第10页的数据,每页显示2条 page_size_query_param = "size" # page=10&size=5 查询第10页,每页显示5条 max_page_size = 5 # 每页最大显示10条
# LimitOffset 类似偏移class CommonLimitOffsetPagination(LimitOffsetPagination): default_limit = 3 # 每页显示2条 limit_query_param = "limit" # limit=3 取3条 offset_query_param = "offset" # offset=1 从第一个位置开始,取limit条 max_limit = 5 # offset=3&limit=2 0 1 2 3 4 5
# app 用下面class CommonCursorPagination(CursorPagination): cursor_query_param = "cursor" # 查询参数 page_size = 2 # 每页多少条 ordering = "id" # 排序字段# 配置在视图类上即可class BookView(ViewSetMixin, ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer permission_classes = [] authentication_classes = [] throttle_classes = [] # 之前的东西一样用 ,内置的分页类不能直接使用,需要继承,定制一些参数后才能使用 # pagination_class = PageNumberPagination #基本分页方式(基本是这种,网页端):http://127.0.0.1:8000/api/v1/books/?page=2&size=3 # pagination_class = LimitOffsetPagination # 偏移分页 http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1 # 从第一条开始,取4条 pagination_class = CommonCursorPagination # 游标分页,只能下一页,上一页,不能跳到中间,但它的效率最高,大数据量分页,使用这种较好
基于APIView编写分页
# 分页功能,只有查询所有才有class BookView(ViewSetMixin, APIView): def list(self, request): books = Book.objects.all() # 使用步骤 # 1 实例化得到一个分页类的对象 paginator = CommonLimitOffsetPagination() # 2 调用分页类对象的paginate_queryset方法来完成分页,返回的page是 要序列化的数据,分页好的 page = paginator.paginate_queryset(books, request, self) if page is not None: serializer = BookSerializer(instance=page, many=True) # 3 返回数据,调用paginator的get_paginated_response方法 # return paginator.get_paginated_response(serializer.data) return Response({ "total": paginator.count, "next": paginator.get_next_link(), "previous": paginator.get_previous_link(), "results": serializer.data })
异常处理
# APIView--->dispatch--->三大认证,视图类的方法,如果出了一场,会被一场捕获,捕获后统一处理# drf 内置了一个函数,只要上面过程出了异常,就会执行这个函数,这个函数只处理的drf的异常-主动抛的非drf异常 -程序出错了 都不会被处理 我们的目标,无论主动抛还是程序运行出错,都同意返回规定格式--》能记录日志 公司里一般返回 {code:999,"msg":"系统错误,请联系系统管理员"} # 写一个函数,内部处理异常,在配置文件中配置一下即可def common_exception_handler(exc, context): # exc 错误对象 # context:上下文,有view:当前出错的视图类的对象,args和kwargs视图类方法分组出来的参数,request:当次请求的request对象 # 只要走到这里,就要记录日志 ,只有错了,才会执行这个函数 # 记录日志尽量详细 print("时间,登录用户id,用户ip,请求方式,请求地址,执行的视图类,错误原因") res = exception_handler(exc, context) if res: # 有值,说明返回了Response 对象,没有值说明返回None # 如果是Response 对象说明是drf的异常,已经被处理了,如果是None表明没有处理,就是非drf的异常 res = Response(data={"code": 888, "msg": res.data.get("detail", "请联系系统管理员")}) else: # res = Response(data={"code": 999, "msg": str(exc)}) # 记录日志 res = Response(data={"code": 999, "msg": "系统错误,请联系系统管理员"}) return res# 在配置文件中配置REST_FRAMEWORK = {"EXCEPTION_HANDLER": "app01.exceptions.common_exception_handler",}
消息!drf认证/权限/频率/分页-过滤-排序
报道:【时间基准】NTP网络时钟服务器助力智能农业系统
快播:C和Python实现快速排序-三数中值划分选择主元(非随机)
宗申新款电动车闪电侠发布:续航超200公里 仪表盘可手机投屏
环球观速讯丨丢失两年的手机半夜仍被人试图解锁 被系统远程拍下照片
网友吐槽快递派送延误 韵达总部:人手紧张正调配
《狂飙》蜚声海外 英国小伙们沉迷剧集无法自拔:竟被打斗画面吸引
今日热文:大货车实线变道 女子科三被别停挂科当场发飙
全球热消息:土耳其一城市震后被海水倒灌:汽车泡在水里
环球观焦点:漂浮在数万米高空 你见到的“不明飞行物”:很可能就是一只气球
一加Ace 2支持双频GPS:发布会上没讲 结果被很多网友误伤
【天天播资讯】太火爆!ChatGPT多次因访问量激增而宕机
程序员常用的6款效率工具,准时下班不是梦
世界看点:春节假期“清零”,任务管理飞项快速助你回到高效状态
全球最新:win10系统,软件不可用,无法调用摄像头
Linux内核跟踪和性能分析
要闻:14年了:“千年老二”微软终于有机会扳倒谷歌搜索
热消息:微星推出Cubi 5 12M迷你主机:仅0.66L、配备双网口
世界热点评!女生应聘被问是否单身!当事公司:要求单身正常 将起诉举报者
【全球时快讯】近50年来首次!日本沙滩惊现大量沙丁鱼 原因未知:开排核废水、也要大地震?
最新资讯:国产车开门红:1月比亚迪称王 大众沦落第三 合资腰斩
03-Pandas详解
今日热讯:ChatGPT能做什么?零基础教你免费使用ChatGPT和账号注册
当前速看:美团面试失败后,翻了两年前的面试题,发现根本不是一个难度的
当前简讯:Linux安装
Spring Boot发送GET/POST请求——RestTemplate的基本使用
当前报道:自研指令集没有侵权MIPS 国产CPU龙芯赢了:摆脱官司
当前讯息:自燃车辆引燃邻车 损失谁来赔?法院释疑
天天最新:基于 eBPF 的 Serverless 多语言应用监控能力建设
世界最新:构建亿级别的消息推送基础模型
全球热文:Linux开源工具之nethogs命令介绍
精选!COBOL教程_编程入门自学教程_菜鸟教程-免费教程分享
华硕发布新款Vivobook 13 Slate笔记本:Intel 7W超低功耗U
今日精选:3岁女童喊脚疼被确诊癌症晚期:神经母细胞瘤 儿童癌症之王
天天微速讯:剧版《三体》弹幕互动量破2000万!豆瓣涨至8.3分
【热闻】iPhone 15 Ultra狂堆料!价格可能贵出天际
环球热议:全球不足50人!宝鸡发现1例罕见黄金血型:比熊猫血更稀有
环球资讯:ASP.Net Core 教程_编程入门自学教程_菜鸟教程-免费教程分享
ChatGPT保姆级注册教程
group by 、concat_ws()、 group_caoncat()的使用
全球热头条丨Jedis那么低性能,还在用吗? lettuce时代开幕啦
热资讯!阿里IM技术分享(十):深度揭密钉钉后端架构的单元化演进之路
强震已致超7700人遇难!土耳其地震背后的人祸 建筑不达标、豆腐渣工程多
全球热议:全球首架国产大飞机C919首飞三亚 民航最高接待礼“过水门”接风
环球关注:iPhone 15 Pro系列拿到三星顶级屏幕!超出S23系列整整两代
全球消息!高级Excel教程_编程入门自学教程_菜鸟教程-免费教程分享
重点聚焦!Serverless 时代开启,云计算进入业务创新主战场
【天天报资讯】Go的参数是传值还是传引用问题
【环球聚看点】【踩坑记录】单测中@PostConstruct多次执行
免费无广告 微软电脑管家2.7公测版发布:任务栏被意外修改有救了
4599元!佳能EOS R50发布:329克超轻便 支持无裁切6K
天天信息:研发10几年、花费千亿:日本国产大飞机为何失败?就是畸形产物
全球微速讯:LV将涨价?国人排长龙抢购 买万元包像在赶集:世界首富曾感慨中国用户有钱
高级Excel图表教程_编程入门自学教程_菜鸟教程-免费教程分享
Apache ANT 教程_编程入门自学教程_菜鸟教程-免费教程分享
焦点播报:算法学习笔记(15): Trie(字典树)
今日讯!火山引擎 DataTester“智能发布”:覆盖产品研发、测试、上线全流程,一站式智能管理 A/B 实验
DB2教程_编程入门自学教程_菜鸟教程-免费教程分享
马斯克将于3月1日公布特斯拉宏图第三篇章 第二篇章已烂尾
世界观速讯丨国产车企1:1复刻几十年前的MINI外观专利 宝马抗议!结果判了
【独家焦点】真心没想到!五旬男子开车撞上护栏:只因刚割了双眼皮
全球热消息:全世界最后一只袋狼究竟是怎么死的?
民企第一只 京东仓储REIT上市:认购额超718亿元遭疯抢
当前视讯!C#(进制转换) NumberConversion
ChatGPT国内也能用吗?ChatGPT国内镜像站点分享给你们
微动态丨暴躁小钢炮!极氪X实车亮相:零百加速3秒级
环球微速讯:《仙剑奇侠传》《和平精英》梦幻联动:赵灵儿端枪吃鸡
啥身材都能包!真维斯连帽卫衣大促:日常100元 现价50到手
6年来苹果iPhone涨价近50% 还会继续涨 库克不怕没人买
《流浪地球2》导演郭帆:国产科幻片工业流程还是初级 吃饭都会出大错误
童话二分之一的大结局是什么?童话二分之一演员表
金棕色适合什么肤色?金棕色和金栗色茶色的区别有哪些?
回避型人格障碍的表现有哪些?回避型人格障碍怎么治疗?
天天快资讯丨袋鼠云数栈UI5.0焕新升级,全新设计语言DT Design,更懂视觉更懂你!
【世界热闻】芯驿电子发布车载系列产品全新品牌AUMO
速讯:仿制作图《这里是中国》封面
【天天播资讯】spring注解
升学宴是什么意思?学生升学宴家长答谢宴致辞
货柜标准尺寸是多少?货柜集装箱尺寸规格表
淘宝换购是什么意思?淘宝换购的东西是正品吗?
笔记本键盘怎么拆卸?笔记本电脑键盘拆卸方法
ddr2内存条还能用吗?ddr2和ddr3的区别有哪些?
爱奇艺弹幕开关在哪里?爱奇艺怎么关闭弹幕?
手机微信语音电话接不到是什么原因?手机微信语音没有声音是怎么回事?
观点:零跑汽车创始人:有信心在一些环节超越特斯拉
【全球热闻】大六缸白菜价!马自达CX-90售价公布:约27.8万元起
美国计划强制让电动汽车“发声” 20多年的老车也不放过
环球热资讯!冷空气今起发货!江南等地暴雨北方局地暴雪 出行注意
人民日报评智能电视套路收费:广告无法消除、会员一充再充
必应、Edge拥抱ChatGPT 微软一晚大赚5400多亿:AI时代已到
焦点报道:女子网上买iPhone 14收到一堆铁片 京东自营退一赔一
天天日报丨用ChatGPT搞钱年入百万!各路博主发布生财之道 网友回呛
今日讯!比亚迪秦PLUS DM-i 2023冠军版宣布2月10日发布:车机、续航全升级
精选!特斯拉跌落神坛?辅助驾驶横评仅得第七
必知必会的设计原则——依赖倒置原则
难怪发质没有变好!这么多年用吹风机竟用错了
每日快看:PC 10年来最大跌幅 2023依然寒气逼人:复活要靠Win10“死亡”
全球通讯!优化渣?《霍格沃兹之遗》3A游戏被指太吃硬件:8GB显存都不好意思打招呼
坐拥千万粉丝医生称女子因洁牙感染梅毒?口腔机构回应 权威科普来了
读Java实战(第二版)笔记04_用流收集数据