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

url控制

第二种写法(只要继承了ViewSetMixin)

     url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取所有记得路由后面加$结束符  #pub/?format=jsonurl(r'^pub\.(?P<format>\w+)$',views.Pub.as_view({'get':'list','post':'create'})),       #pub.jsonurl(r'^pub/(?P<pk>\d+)$',views.Pub.as_view({'get':'retrieve','put':'update','delete':'destroy'})),   #获取一条

第三种(自动生成路由,必须继承ModelViewSet)

from django.conf.urls import url,include

  SimpleRouter 自动生成两条路由

from rest_framework.routers import SimpleRouter,DefaultRouter #路由控制

router = SimpleRouter()
router.register('pub',views.Pub)urlpatterns = [url(r'^admin/', admin.site.urls),#其他路由
url(r'',include(router.urls)),]

  DefaultRouter自动生成四条路由

from rest_framework.routers import SimpleRouter,DefaultRouter #路由控制

router = DefaultRouter()
router.register('pub',views.Pub)urlpatterns = [url(r'^admin/', admin.site.urls),#其他路由url(r'',include(router.urls)),]

 

解析器(一般不需要动,项目最开始全局配置一下就可以了)

作用:控制视图类能够解析前端传过来的格式是什么样的 (默认配置三种都有) 有application/json,x-www-form-urlencoded,form-data等格式

全局使用:在settings中配置:

REST_FRAMEWORK = {"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser',]
}

局部使用:

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser#json字典 urlencoded  form-data       文件

  在视图类中

parser_classes=[JSONParser,]

源码流程

  当调用request.data的时候去执行解析方法

-->根据传过来的编码方式选择一个解析器对象

--->调用解析器对象的parser方法完成解析

 

 

在调用request.data时,才进行解析,由此入手@propertydef data(self):if not _hasattr(self, '_full_data'):self._load_data_and_files()return self._full_data
查看self._load_data_and_files()方法---->self._data, self._files = self._parse()def _parse(self):#用户请求头里content_type的值media_type = self.content_type#self.parsers 就是用户配置的parser_classes = [FileUploadParser,FormParser ]#self里就有content_type,传入此函数parser = self.negotiator.select_parser(self, self.parsers)
查看self.negotiator.select_parser(self, self.parsers)def select_parser(self, request, parsers):#同过media_type和request.content_type比较,来返回解析器,然后调用解析器的解析方法#每个解析器都有media_type = 'multipart/form-data'属性for parser in parsers:if media_type_matches(parser.media_type, request.content_type):return parserreturn None
最终调用parser的解析方法来解析parsed = parser.parse(stream, media_type, self.parser_context)
源码注释
Request实例化,parsers=self.get_parsers()Request(request,parsers=self.get_parsers(),authenticators=self.get_authenticators(),negotiator=self.get_content_negotiator(),parser_context=parser_context)
get_parsers方法,循环实例化出self.parser_classes中类对象def get_parsers(self):return [parser() for parser in self.parser_classes]            
self.parser_classes 先从类本身找,找不到去父类找即APIVIew 中的parser_classes = api_settings.DEFAULT_PARSER_CLASSES
api_settings是一个对象,对象里找DEFAULT_PARSER_CLASSES属性,找不到,会到getattr方法def __getattr__(self, attr):if attr not in self.defaults:raise AttributeError("Invalid API setting: '%s'" % attr)try:#调用self.user_settings方法,返回一个字典,字典再取attr属性val = self.user_settings[attr]except KeyError:# Fall back to defaultsval = self.defaults[attr]# Coerce import strings into classesif attr in self.import_strings:val = perform_import(val, attr)# Cache the result
            self._cached_attrs.add(attr)setattr(self, attr, val)return val
user_settings方法 ,通过反射去setting配置文件里找REST_FRAMEWORK属性,找不到,返回空字典@propertydef user_settings(self):if not hasattr(self, '_user_settings'):self._user_settings = getattr(settings, 'REST_FRAMEWORK', {})return self._user_settings
源码注释2

 

 

响应器

 解析成字符串 还是一个浏览器页面

from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer  #解析成字符串 还是浏览器样式的
# 不用动,就用全局配置即可默认配置中两个都有

全局使用

  在settings中配置 settings默认配置中两个都有

REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser',],# 响应器 默认配置两个都由 这个是全局使用
# 'DEFAULT_PARSER_CLASSES':[ 'rest_framework.renderers.JSONRenderer',
#         'rest_framework.renderers.BrowsableAPIRenderer',]
    
}

局部使用

  在试图类中配置

renderer_classes = [JSONRenderer, BrowsableAPIRenderer]    

 

版本控制

 作用用于控制版本    视图中 版本问题需要接受版本传过来的参数 注意是单个没有复数

内置版本控制

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/

局部使用

#在CBV类中加入
versioning_class = URLPathVersioning
url中需要写
 url(r'(?P<version>[v1|v2])/register/$',views.Register.as_view()),url(r'(?P<version>[v1|v2])/register\.(?P<format>\w+)$',views.Register.as_view()),url(r'(?P<version>[v1|v2])/register/(?P<pk>\d+)$',views.Register.as_view()),

写访问路由的的时候要写上版本

 

 

全局使用

  在settings中配置

REST_FRAMEWORK = {"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser',],'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning','DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本'VERSION_PARAM': 'version',  # URL中获取值的key

}

路由不要写

url(r'register/$',views.Register.as_view()),

 

但是访问路由的时候需要写上版本

 

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

 

示例

基于正则的方式

from django.conf.urls import url, include
from web.views import TestViewurlpatterns = [url(r'^(?P<version>[v1|v2]+)/test/', TestView.as_view(), name='test'),
]url
View Code
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import URLPathVersioningclass TestView(APIView):versioning_class = URLPathVersioningdef get(self, request, *args, **kwargs):# 获取版本print(request.version)# 获取版本管理的类print(request.versioning_scheme)# 反向生成URLreverse_url = request.versioning_scheme.reverse('test', request=request)print(reverse_url)return Response('GET请求,响应内容')views.py
View.py
        # 基于django内置,反向生成urlfrom django.urls import reverseurl2=reverse(viewname='ttt',kwargs={'version':'v2'})print(url2)
View Code

 

源码分析

#执行determine_version,返回两个值,放到request对象里
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, schemedef determine_version(self, request, *args, **kwargs):#当配置上版本类之后,就会实例化if self.versioning_class is None:return (None, None)scheme = self.versioning_class()return (scheme.determine_version(request, *args, **kwargs), scheme)

 

分页

 

 常规分页   查看第n页 每页显示多少条

#分页                                 #常规分页                   偏移分页        cursor游标分页
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPaginationclass PublishView(APIView):versioning_class = URLPathVersioningparser_classes = [JSONRenderer,]    #解析器def get(self,request,*args,**kwargs):#第一种方法,普通分页'''查询出所有数据实例化产生一个普通分页对象每页显示多少条查询指定查询那一页的key值'''ret= models.Publish.objects.all()page = PageNumberPagination()page.page_size = 3 #每页显示多少条 page.page_query_param = 'page'  #按照page名词显示那一页# 前端控制每页显示多少条的查看key值必然要size=9,表示一页显示9条page.page_size_query_param = 'size'#控制每页最大显示多少,size如果传100,最多也是显示10page.max_page_size = 10ret_page = page.paginate_queryset(ret,request,self)#序列化pub_ser = PublishSerlizers(ret_page,many=True)#去settings中配置每页显示多少条    这个是全局配置的话 局部配置全局可以不配置return Response(pub_ser.data)

settings中配置

REST_FRAMEWORK = {# 每页显示两条'PAGE_SIZE':2
}

路由

  url(r'^(?P<version>[v1|v2]+)/publish/',views.PublishView.as_view())

serializer

from rest_framework.serializers import  ModelSerializer
from app01 import models
class PublishSerlizers(ModelSerializer):class Meta:model = models.Publishfields = '__all__'

 

偏移分页   在第n个位置向前向后查询第n个位置

#分页                                 #常规分页                   偏移分页        cursor游标分页
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPaginationclass PublishView(APIView):versioning_class = URLPathVersioningparser_classes = [JSONRenderer,]    #解析器def get(self,request,*args,**kwargs):   #偏移分页ret = models.Publish.objects.all()#实例化产生一个偏移分页对象page= LimitOffsetPagination()# 四个参数:# 从标杆位置往后取几个,默认取3个,可以指定page.default_limit = 3# 每条取得条数page.limit_query_param ='limit'# 标杆值,现象偏移到那个位置,如果offset=6, 表示当前在第6条位置上,往后取page.offset_query_param = 'offset'# 最大取10条page.max_limit = 10ret_page = page.paginate_queryset(ret,request,self)#序列化pub_ser= PublishSerlizers(ret_page,many=True)#取settings中配置每页显示多少条return page.get_paginated_response(pub_ser.data)

 

 cursor游标分页

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
class PublishView(APIView):versioning_class = URLPathVersioningparser_classes=[JSONParser,]def get(self, request, *args, **kwargs):ret = models.Publish.objects.all()# 实例化产生一个偏移分页对象page = CursorPagination()#三个参数:#每页显示的大小page.page_size=3#查询的key值page.cursor_query_param='cursor'# 按什么排序page.ordering='id'ret_page = page.paginate_queryset(ret, request, self)# 序列化pub_ser = serializer.PublishSerializers(ret_page, many=True)# 去setting中配置每页显示多少条return page.get_paginated_response(pub_ser.data)

 

转载于:https://www.cnblogs.com/lakei/p/11143411.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…

使用Java 8和Lambda简化ReadWriteLock

考虑到旧版Java代码&#xff0c;无论您在哪里看&#xff0c;带有lambda表达式的Java 8绝对可以提高质量和可读性。 今天&#xff0c;让我们看一下ReadWriteLock以及如何使它使用起来更简单。 假设我们有一个称为Buffer的类&#xff0c;该类可以记住队列中的最后几条消息&#x…

[导入]C#好书盘点【月儿原创】

C#好书盘点【月儿原创】 文章来源:http://blog.csdn.net/21aspnet/archive/2007/07/07/1682200.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/07/08/816177.html

岁月如歌,人生如诗

虎跃千山龙腾海&#xff0c;春满家园喜满怀。新的一年&#xff0c;孕育着新的生命&#xff1b;新的一年&#xff0c;掸去了飞雪的扬花&#xff0c;满心的惬意告诉我们&#xff0c;所有的期盼与期望&#xff0c;一切的向往与憧憬正向着我们走近&#xff0c;向着春天融合。 ​ 新…

DOM编程以及domReady加载的几种方式

1&#xff0c;关于DOM编程 DOM编程主要是对dom树节点进行操作&#xff0c;所以你必须掌握基本的节点类型&#xff0c;如何去获取节点名字以及值&#xff08;这些相关知识你可以去网上查&#xff0c;这里推荐一个慕课学习网站->https://www.imooc.com/video/9491&#…

倒叙输出 php,php foreach正序倒序输出示例代码

实现代码&#xff1a;// 正序foreach($files as $file_num > $file) {if(is_file($directory.$file)){//$file iconv("gb2312","UTF-8",$file); //或者 iconv("gb2312","UTF-8",$value);$date substr($file,0,9);echo ;echo ;ech…

黑色系产业结构

转载于:https://www.cnblogs.com/luoluo-123/p/11143867.html

在Java 8 Lambda中创建自己的循环结构

Java没有简单的构造可以重复N次。 当然&#xff0c;我们可以创建一个for循环&#xff0c;但是很多时候我们甚至都不关心在循环中创建的变量。 我们只想重复一些代码N次&#xff0c;仅此而已。 使用Java 8中的lambda时&#xff0c;您可以尝试执行以下操作&#xff1a; public c…

Smart Form Tutorial(适用新手学习)

发现Smart Form在ECC6中和4.6C相比改变了不少&#xff0c;最近重新研究了一下。help.sap.com上的文档基本上是针对新特性的&#xff0c;不过例子却还是旧的。做个笔记省的以后找不到最新的example。最大的改变在Table上&#xff0c;现在table的header和footer比以前好做了。还是…

执行命令npm install XXX后仍然提示 Cannot find Module XXX

最近遇到一个问题&#xff0c;在服务器上配置完node环境后 执行npm start 命令后提示 Cannot find Module "Jquery" 然后就知道可能没有安装jquery 就继续在当前文件夹下执行 npm install jquery 但是再次执行后却仍然提示 Cannot find Module "Jquery"…

青蛙学Linux—Zabbix Web使用之Zabbix发现功能①自动网络发现

Zabbix的发现功能用于自动发现主机或者监控数据&#xff0c;包括以下三种发现类型&#xff1a; 自动网络发现&#xff08;Network discovery&#xff09;主动客户端自动注册&#xff08;Active agent auto-registration&#xff09;低级别发现&#xff08;low-level discovery&…

php 修改 wordpress,wordpress怎么编辑代码修改页面

wordpress是用PHP写的。PHP是服务器端执行脚本文件。然后到客户端(就是网页)生成html文件。你看到的html代码都是PHP程序在服务器端执行后生成的。若要修改代码主要是看想修改那一部分的内容。然后找到其对应的PHP代码.然后修改。在后台点击-->,就能看见你现在使用的wp主题的…

mpvue tabBar设定 app.json

1.微信小程序&#xff0c;设置src/app.json 中的tabBar 图标选择来自 iconfont 如图所示 小程序显示如下&#xff1a; 转载于:https://www.cnblogs.com/0909/p/11144861.html

JDK 8时代的抽象类与接口

在新的Java 8日期和时间API&#xff1a;Stephen Colebourne的访谈中 &#xff0c; Stephen Colebourne告诉Hartmut Schlosser &#xff1a;“我认为最重要的语言更改不是lambda&#xff0c;而是接口上的静态方法和默认方法。” Colebourne补充说&#xff1a;“添加默认方法消除…

察看linux内存使用情况

free功能说明&#xff1a;显示内存状态。语  法&#xff1a; free [-bkmotV][-s <间隔秒数>]补充说明&#xff1a;free指令会显示内存的使用情况&#xff0c;包括实体内存&#xff0c;虚拟的交换文件内存&#xff0c;共享内存区段&#xff0c;以及系统核心使用的缓冲区…

ajax请求拿到多条数据拼接显示在页面中

首先我们拿到的了一坨Json数据 如下 然后通过ajax请求拿到数据 在ajax的success方法中处理和使用数据&#xff1a; 其中包括&#xff1a; 用eval处理这种数据 var outStr eval(( data.data )); 用循环取出数据并使用 $.each(outStr,function(index){ console.log(outStr[i…

onesignal php,PHP FPM源代码反刍品味之五:信号signal处理

unix 的信号signal常用于进程管理.比如管理员或者操作系统通过向master进程实现重启和关闭服务&#xff0e;master进程通过向worker进程发信号管理worker进程&#xff0e;通常会在进程自定义信号处理函数,处理相关的逻辑.自定义信号处理函数,从使用者的角度看,很简单,有点像快捷…

【leetcode】657. Robot Return to Origin

Algorithm 【leetcode】657. Robot Return to Origin https://leetcode.com/problems/robot-return-to-origin/ 1&#xff09;problem There is a robot starting at position (0, 0), the origin, on a 2D plane. Given a sequence of its moves, judge if this robot ends up…

HTTP Developer's Handbook Part V: Security 读书笔记

Thus, the SSL handshake takes place once a TCP connection has been established between the Web client and Web server and before the initial HTTP request is sent.转载于:https://www.cnblogs.com/huyi/archive/2010/11/06/1870686.html

Spring 3.2矩阵变量是什么? - 第1部分

Spring 3.2引入了对处理“矩阵变量”的支持&#xff0c;并且可能像大多数开发人员一样&#xff0c;我从未听说过它们。 因此&#xff0c;经过一番研究&#xff0c;我对这个博客的了解是什么&#xff0c;以及您可以如何使用它们。 和往常一样&#xff0c;如果我错了&#xff0c;…