解析器介绍:

所谓解析器,就是前端传过来的数据,后端可以解析,从request.data中取出来,默认的解析器配置是三种编码格式都可以取

回到顶部

解析器的作用:

根据请求头(content-type)选择对应的解析器对请求体内容进行处理,有application/json,x-www-form-urlencoded,form-data等格式

设置解析器就可以控制前端传过来的数据类型进行限制,比如说我只能解析json格式的数据,那么前端必须给我传json数据我才能拿到

三种编码格式:urlencoded,formdata,json
-urlencoded:在body体中的格式是:name=xxx&age=18&wife=liyitong
-formdata:在body体中的格式数据部分跟文件部分有区分
-json格式:在body体中就是json格式

解析器的使用:

(实际就是通过配置解析器,让后端只接收某一种格式的请求数据类型,这样后端只能解析该类型数据,其它类型的请求都会无效,当然设置一种也可以设置多种)

局部使用:

测试:

全局使用:
先了解一下默认解析三种格式的设置代码:
全局设置:

--------------------------------------------------------------------
注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895817687
--------------------------------------------------------------------在setting中配置:REST_FRAMEWORK = {"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser',]}

三、响应器:

回到顶部
响应器的作用:
根据用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。

回到顶部
响应器的使用:

-from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
-不用动,就用全局配置即可
-全局使用:
-在setting中配置
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
]
-局部使用:
-在视图类中配置:
renderer_classes = [JSONRenderer, BrowsableAPIRenderer]

响应器的内置渲染器:
显示json格式:JSONRenderer

访问URL:http://127.0.0.1:8000/test/?format=json
http://127.0.0.1:8000/test.json
http://127.0.0.1:8000/test/

默认显示格式:BrowsableAPIRenderer(可以修改它的html文件)

访问URL:http://127.0.0.1:8000/test/?format=api
http://127.0.0.1:8000/test.api
http://127.0.0.1:8000/test/

表格方式:AdminRenderer

    访问URL:http://127.0.0.1:8000/test/?format=adminhttp://127.0.0.1:8000/test.adminhttp://127.0.0.1:8000/test/

form表单方式:HTMLFormRenderer

    访问URL:http://127.0.0.1:8000/test/?format=formhttp://127.0.0.1:8000/test.formhttp://127.0.0.1:8000/test/

四、版本控制

restful规范里,提出过版本的概念,也就是说版本控制就是相对于接口而言,它有多个版本,就好像应用程序、手机app都会更新版本一样,会修改更新接口文件,这时候就不能在原接口进行修改更新,应该另起一个接口作为版本2(假设为v2)来提供给用户使用,原来的版本可能是v1,那么v1和v2版本提供给外界的控制,就是版本控制。

通过路由拼接版本号或者放入请求头中的途径来获取对应版本号的接口,进行请求。

from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning#基于url的get传参方式:QueryParameterVersioning------>如:/users?version=v1
#基于url的正则方式:URLPathVersioning------>/v1/users/
#基于 accept 请求头方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0
#基于主机名方法:HostNameVersioning------>v1.example.com
#基于django路由系统的namespace:NamespaceVersioning------>example.com/v1/users/

全局使用:

    -在setting中配置:    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning','DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本'VERSION_PARAM': 'version'  # URL中获取值的key
    -路由需要修改-url(r'^(?P<version>[v1|v2]+)/test/', views.Test.as_view()),


局部使用:


在视图类中就可以通过:request.version取出当前访问哪个版本,相应的取执行相应版本的代码

回到顶部

五、DRF分页器

前戏:批量创建多条数据用于测试分页:

url(r'^pagetest/', views.PaginationTest.as_view()),
# views.pyclass PaginationTest(APIView):# 批量创建publish记录,用于测试分页def post(self,request):pub_l = []for i in range(1000):pub_l.append(models.Publish(name='出版社[%s]' % (i+1), addr='地址[%s]' % (i+1)))models.Publish.objects.bulk_create(pub_l)return Response('批量创建成功')

常规分页

url(r’^pagetest/’, views.PaginationTest.as_view()),

# 视图类from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
from app01.MySer import PublishSerclass PaginationTest(APIView):# 批量创建publish记录,用于测试分页def post(self,request):pub_l = []for i in range(1000):pub_l.append(models.Publish(name='出版社[%s]' % (i+1), addr='地址[%s]' % (i+1)))models.Publish.objects.bulk_create(pub_l)return Response('批量创建成功')def get(self, request, *args, **kwargs):# 拿到所有数据publish_list = models.Publish.objects.all()# 实例化出page对象page = PageNumberPagination()
# ================ page相关参数配置开始 ================ ## # 每页显示10条,也可以在settings.py中添加全局配置('PAGE_SIZE': 10 )page.page_size = 10# # 设置每页条数的拼接key(默认为size)page.page_size_query_param = 'size0'# # 控制每页最大显示条数:(这个控制仅限制于路径后拼接设置size0=1000后,对其进行限制)page.max_page_size = 30# # 设置定位的页数的拼接key(默认是page)page.page_query_param = 'page0'
# ================ page相关参数配置结束 ================ ## 对数据进行分页处理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)return Response(pub_ser.data)

也可以在全局配置每页显示条数:
测试:



偏移分页

偏移分页与普通分页使用基本相同,类不同,配置的参数名称不同

# 偏移分页:def get(self, request, *args, **kwargs):# 拿到所有数据publish_list = models.Publish.objects.all()# 实例化出page对象page = LimitOffsetPagination()
# ================ page相关参数进行配置开始 ================ ## # 从标杆位置往后取几个,比如指定取10个page.default_limit = 10# # 拼接key值自定义# 拿几条记录的key值自定义page.limit_query_param = 'limit0'# 标杆值(起始位置),从设置的offset0值那个位置往后拿limit0值的记录page.offset_query_param = 'offset0'# # 设置最大取10条page.max_limit = 20
# ================ page相关参数进行配置结束 ================ ## 对数据进行分页处理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)return Response(pub_ser.data)

补充:get_paginated_response的使用

将return Response(pub_ser.data) 替换成 return page.get_paginated_response(pub_ser.data)
作用测试图:(此方法主要用于游标分页中,因为游标分页并不能指定第几页第几页,只有上一页和下一页)
cursor游标分页

# 游标分页:def get(self, request, *args, **kwargs):# 拿到所有数据publish_list = models.Publish.objects.all()# 实例化出page对象page = CursorPagination()# ================ page相关参数进行配置开始 ================ ## # 每页显示条数page.page_size = 5# # 查询的key值自定义,默认是cursor,无需更改page.cursor_query_param = 'cursor'# 游标分页会将记录进行排序,然后根据排序的记录进行分页显示,设置排序依据page.ordering = 'id'# ================ page相关参数进行配置结束 ================ ## 对数据进行分页处理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)# 如果使用Response返回数据,就不知道怎么定位上一页和下一页了# return Response(pub_ser.data)# 使用get_paginated_response,返回结果return page.get_paginated_response(pub_ser.data)

游标分页的cursor后面的值我们是不知道的,所以拼不出来:

游标分页特点:它是一种加密分页,只能看上一页和下一页,速度快

Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)相关推荐

  1. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  2. Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(一)

    阅读目录 一.url控制 基本路由写法:最常用 第二种写法:继承ModelViewSet 第三种写法:(自动生成路由,必须继承ModelViewSet) 二.解析器 前端不同的数据格式请求,后端解析得 ...

  3. 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!

    利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow  + qrcode 模块 核心代码import qrcodeqr = q ...

  4. drf 解析器,响应器,路由控制

    解析器 作用: 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有application/json,x-www-form-urlencoded,form-data等格式使 ...

  5. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    阅读目录 一.认证组件 使用方法: token简单描述: 应用token编写登录接口: 二.权限组件 使用方法: 三.频率组件 使用方法: 一.认证组件 回到顶部 使用方法: ①写一个认证类,新建文件 ...

  6. Django框架深入了解_02(DRF之序列化、反序列化)

    阅读目录 序列化:将Python对象准换成json格式的字符串,反之即为反序列化 DRF的序列化使用过程: 使用drf的序列化组件 -1 新建一个序列化类继承Serializer -2 在类中写要序列 ...

  7. Django框架之CBV类视图及类视图装饰器

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  8. django框架预备知识

    内容: 1.web预备知识 2.django介绍 3.web框架的本质及分类 4.django安装与基本设置 1.web预备知识 HTTP协议:https://www.cnblogs.com/wyb6 ...

  9. 订单支付和评论——基于Django框架的天天生鲜电商网站项目系列博客(十五)

    系列文章目录 需求分析--基于Django框架的天天生鲜电商网站项目系列博客(一) 网站框架搭建--基于Django框架的天天生鲜电商网站项目系列博客(二) 用户注册模块--基于Django框架的天天 ...

最新文章

  1. C#的UInt64.MaxValue和C语言的0xffffffffffffffc5ull
  2. php5.3源码,php5.3介绍
  3. beanstalkd php扩展,PHP操作Beanstalkd队列(1)安装与基础
  4. 面向对象程序设计-C++ Default constructor Copy constructor Destructor Operator Overloading【第九次上课笔记】...
  5. 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架
  6. 网络丢包诊断与分析的现实与理想
  7. java int stack_java中int算法的有趣现象
  8. 【杂题总汇】HDU多校赛第十场 Videos
  9. Java EE7和Maven工程入门(1)
  10. linux下思维导图软件,Linux思维导图软件
  11. uva1391Astronauts【2-SAT】
  12. Python 合并两个或多个pdf文件(获取pdf文件指定页)
  13. color a dir/s_揭发Wuli杨幂的quot;A字裙quot;执念!一款裙也要72变!
  14. 课堂派微信端重设计建议
  15. 树莓派系统最小img镜像的制作-备份与还原
  16. 电脑计算机窗口不见了怎么调出来,电脑桌面上的任务栏不见了怎么办
  17. UnsupportedOperationException:setProperty must be overridden by all subclasses of SOAPMessage解决方法有效
  18. 微服务架构深度解析与最佳实践 - 第五部分:七个应对策略之性能、一致性与高可用
  19. 2021年焊工(初级)免费试题及焊工(初级)实操考试视频
  20. 20190829王老师发的面试题1、有一个日志文件access.log,内容如下

热门文章

  1. mysql安装后创建,Mysql安装创建删除
  2. Error:Kotlin: Module was compiled with an incompatible version of Kotlin
  3. Elasticsearch系列「二」如何物理删除给定期限的历史数据?
  4. Little Sub and Balloons
  5. 数据库保护(数据库备份)Sql Server2012 图形界面操作
  6. RxJava 和 RxAndroid 二(操作符的使用)
  7. Android 优化电池使用时间——根据需要操作广播接收器
  8. SQLi-LABS(11~20关详解)
  9. JS 与 JAVA 跨语言实现 RSA 和 AES加密算法
  10. 简单记线程安全的集合类