解析器

1.json解析器

发一个json格式的post请求。后台打印:
request_data---> {'title': '北京折叠'}
request.POST---> <QueryDict: {}>

2.urlencode解析器

request_data---> <QueryDict: {'title': ['北京'], 'price': ['122']}>
request.POST---> <QueryDict: {'title': ['北京'], 'price': ['122']}>

rest-framework默认支持的有3种解析器,json,form,文件上传。而Django原生只支持form的解析,不支持json的解析。

源码:

JSON解析器类:

class JSONParser(BaseParser):"""Parses JSON-serialized data."""media_type = 'application/json'renderer_class = renderers.JSONRendererstrict = api_settings.STRICT_JSONdef parse(self, stream, media_type=None, parser_context=None):"""Parses the incoming bytestream as JSON and returns the resulting data."""parser_context = parser_context or {}encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)try:decoded_stream = codecs.getreader(encoding)(stream)parse_constant = json.strict_constant if self.strict else Nonereturn json.load(decoded_stream, parse_constant=parse_constant)except ValueError as exc:raise ParseError('JSON parse error - %s' % six.text_type(exc))

form解析器类:

class FormParser(BaseParser):"""Parser for form data."""media_type = 'application/x-www-form-urlencoded'def parse(self, stream, media_type=None, parser_context=None):"""Parses the incoming bytestream as a URL encoded form,and returns the resulting QueryDict."""parser_context = parser_context or {}encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)data = QueryDict(stream.read(), encoding=encoding)return data

文件上传类:

class MultiPartParser(BaseParser):"""Parser for multipart form data, which may include file data."""media_type = 'multipart/form-data'def parse(self, stream, media_type=None, parser_context=None):"""Parses the incoming bytestream as a multipart encoded form,and returns a DataAndFiles object.`.data` will be a `QueryDict` containing all the form parameters.`.files` will be a `QueryDict` containing all the form files."""parser_context = parser_context or {}request = parser_context['request']encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)meta = request.META.copy()meta['CONTENT_TYPE'] = media_typeupload_handlers = request.upload_handlerstry:parser = DjangoMultiPartParser(meta, stream, upload_handlers, encoding)data, files = parser.parse()return DataAndFiles(data, files)except MultiPartParserError as exc:raise ParseError('Multipart form parse error - %s' % six.text_type(exc))

URL控制

1.因为每次url都需要写下面的2条线,导致代码冗余。

 # url(r'authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="authors"),# url(r'authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="authordetail"),

2.使用rest-framework提供的:

from django.conf.urls import url,include
from app01 import viewsfrom rest_framework import routers
routers=routers.DefaultRouter()
routers.register("authors",views.AuthorModelView)

url中需要加这一句即可:

url(r'',include(routers.urls)),

以后每一个表,注册一下即可,前面的是url的前缀,后面是对应的视图类。

测试结果以及自动生成的url路径如下图:(可以直接.json取到结果)

生成的URL:

分页

1.基本分页器:

from rest_framework.pagination import PageNumberPagination#自己写一个继承分页器,然后自己设置
class MyPageNumberPagination(PageNumberPagination):page_size = 2                    #每个页面显示多少数据page_query_param = "page"        #?page  的名字,默认"page",可以改其他page_size_query_param = "size"   #临时的一个分页数目,虽然最多2条,但是可以临时扩大每页显示的数据数量max_page_size = 3                #虽然临时的可以调,但不能无限大,做一个最大临时限制。class BookView(APIView):# authentication_classes = [TokenAuth]def get(self,request):print(request.user)   #token_obj.user.nameprint(request.auth)   #token_obj.tokenbook_list=Book.objects.all()#加入分页pnp=MyPageNumberPagination()   #分页器实例对象  books_page=pnp.paginate_queryset(book_list,request,self)    #传入数据bs2=BookModelSerializers(books_page,many=True,context={'request': request}) #将分好的数据进行序列化并展示return Response(bs2.data)

2.偏移分页器(很少用到):

from rest_framework.pagination import LimitOffsetPagination

和上面一模一样,只是加了一个offset的偏移参数。

3.对于高度封装的视图类怎么使用分页器:

from rest_framework import viewsets
class AuthorModelView(viewsets.ModelViewSet):queryset=Author.objects.all()serializer_class=AuthorModelSerializerspagination_class = MyPageNumberPagination

因为这个作者的视图进行了高度的封装,显然重写list方法并且进行分页展示非常的麻烦,那么使用一个

pagination_class =你自己继承分页器并且定制好的分页器类即可完成分页。

4.全局配置分页数目:

settings中进行配置。

REST_FRAMEWORK={# "DEFAULT_AUTHENTICATION_CLASSES":["app01.utils.TokenAuth",],# "DEFAULT_PERMISSION_CLASSES":["app01.utils.SVIPPermission",],"PAGE_SIZE":3,
}

响应器

from rest_framework.response import Response

针对rest-frarmwork返回的数据进行各种操作,如果使用浏览器,那么响应器会渲染一个页面出来提供各种操作,如果使用postman,只返回一堆数据。

具体如下图:

postman:

浏览器上:

这个页面可进行option,delete,put操作。

针对所有数据,下面可以进行get和post请求。



 渲染器


这里可以使用Json的渲染器

也可以是这种页面形式的(用的少)


全局配置渲染器:

版本控制

1.先导入

from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning

2.在APIView中

3.局部配置

4.全局配置

settings中配置:

REST_FRAMEWORK={# "DEFAULT_AUTHENTICATION_CLASSES":["app01.utils.TokenAuth",],# "DEFAULT_PERMISSION_CLASSES":["app01.utils.SVIPPermission",],"PAGE_SIZE":1,# 配置全局渲染器(Json格式的,和那种页面形式的)# 'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer',]'DEFAULT_VERSION_CLASS':'rest_framework.versioning.QueryParameterVersioning',#使用哪种版本控制'ALLOWED_VERSIONS':['v1','v2'],  #允许的版本'VERSION_PARAM':'version',       #参数'DEFAULT_VERSION':'v1',           #默认版本

}

5.对于两种不同的配置要说的是。

(1)对于QueryParameterVersioning这种

在url后缀加上版本。

后端通过request.version就可以拿到这个版本

(2)对于URLPathVersioning(推荐使用)

这个实在URL里面直接写。

首先要在url做一个配置。

 url(r'^(?P<version>\w+)/books/$', views.BookView.as_view(),name="books"),

get请求参数拿到这个version。

    def get(self,request,*args,**kwargs):print("version",request.version)#print(request.user)   #token_obj.user.name#print(request.auth)   #token_obj.tokenbook_list=Book.objects.all()#加入分页pnp=MyPageNumberPagination()books_page=pnp.paginate_queryset(book_list,request,self)# bs=BookSerializers(book_list,many=True)bs2=BookModelSerializers(books_page,many=True,context={'request': request})# return Response(bs.data)return Response(bs2.data)

前端页面的URL是

因为在全局做了允许配置,所以只能是v1,v2如果输入其他会报错。

这就是版本控制。



转载于:https://www.cnblogs.com/geogre123/p/9750057.html

rest-framework解析器,url控制,分页,响应器,渲染器,版本控制相关推荐

  1. rest-framework 响应器(渲染器)

    一 作用: 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 用户请求URL:     http://127.0.0.1:8000/test/?format=json     ht ...

  2. Vue渲染器(一):渲染器的设计

    渲染器(一):渲染器的设计 1.前言: 接下来就开始详细讨论渲染器的实现细节了,这也是Vue.js中非常重要的一部分,很多功能依赖渲染器来实现,例如 Transition组件.Teleport组件.S ...

  3. rest-framework之响应器(渲染器)

    https://www.cnblogs.com/liuqingzheng/articles/9766413.html 一 作用 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 用 ...

  4. vr降噪器英文是什么_CR渲染器和VR渲染器在3d效果图上的区别

    个人倾向于用max2018+VR4.2+CR5.0,安装包可共享. 没有不好用的渲染器,只有不好用的渲染技术.VR更有普遍市场,渲染速度快,CR渲染效果好,尤其灯光效果柔和. 相信不论是大神还是小白, ...

  5. Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】

    应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论.文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是 ...

  6. 29.渲染器Renderer

    什么是渲染器 渲染器就是将服务器生成的数据格式转为http请求的格式 渲染器触发及参数配置 在DRF配置参数中,可用的渲染器作为一个类的列表进行定义 但与解析器不同的是,渲染器的列表是有顺序关系的 R ...

  7. 自定义 Spark item 的渲染器

    在 DAtaGroup , SkinnableDataContainer 或它们的子类中定义自己的项目渲染器可以控制数据项的显示外观,数据项的外观包括字体.背景色.边界和其他的可视方面.项目渲染器也可 ...

  8. Unity API-----Renderer(渲染器)

    Unity API-----Renderer(渲染器) 官方文档阅读记录 版本 : 2019.3 官方文档传送门 Renderer是UnityEngine命名空间下的一个类. Renderer继承于C ...

  9. Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)

    需要源码和图片集请点赞关注收藏后评论区留言~~~ 一.PDF文件渲染器 Android集成了PDF的渲染操作,从很大程度上方便了开发者,这个PDF文件渲染器便是PdfRenderer.渲染器允许从存储 ...

最新文章

  1. DataGrid列操作
  2. iOS App上架流程(2016详细版),真心很详细。
  3. ​台媒:台积电2nm制程获重大突破
  4. 'ModelOptions' object has no attribute 'get_field_names
  5. 如果《赛博朋克2077》走进现实,人类如何摆脱AI的支配?
  6. ASP.NET网页中RAR、DOC、PDF等文件下载功能实例源代码
  7. 博客开张了!博客开张了!博客开张了!
  8. Windows下卸载Oracle
  9. 素材解析程序源代码,用thinkphp开发的 支持12大网站,其他需要定制
  10. Windows10如何彻底卸载MySQL
  11. 联想硬盘保护系统 计算机名 后缀,联想硬盘保护7.07.6安装及计算机名相同的解决方法...
  12. Unity3dC#分布式游戏服务器ET框架介绍-组件式设计(转)
  13. pycharm离线安装中文插件
  14. 毕业论文完成,感谢帮助过我的人
  15. Android 更换壁纸 代码
  16. 源码时代UI干货分享| AE如何实现文字消散效果?看这一篇就够了!
  17. Non-negative Matrix Factorization 非负矩阵分解
  18. Discuz插件提示:对不起,您安装的不是正版应用的解决办法
  19. 重磅 | 2018年淘宝村、淘宝镇名单正式公布!
  20. 华为ENSP模拟器CE12800 CE6800设备包

热门文章

  1. Vue3学习之第一节:初识setup
  2. 360mysql连接池_自己动手写个数据库连接池
  3. 计算机上机单招试题及答案,全国高职单招计算机类模拟试卷考卷及答案
  4. 猜数游戏控制猜测次数c语言,C语言小游戏之猜数字,三子棋游戏
  5. layui数据表格格式化
  6. 光头强的圆球机器人视频_《熊出没狂野大陆》快上映了,看了多年光头强,还能有新鲜动画吗...
  7. 【CCCC】L3-003 社交集群 (30分),并查集模板,map排序
  8. 【图论】二分图学习笔记
  9. 第四章 ASP.NET MVC HTML.ActionLink输出超链接的具体用法
  10. JavaScript文档对象模型概述(1)