深入解析当下大热的前后端分离组件django-rest_framework系列四
查漏补缺系列
解析器
request类
django的request类和rest-framework的request类的源码解析
局部视图
from rest_framework.parsers import JSONParser,FormParser
class PublishViewSet(generics.ListCreateAPIView):
parser_classes = [FormParser,JSONParser]
queryset = Publish.objects.all()
serializer_class = PublshSerializers
def post(self, request, *args, **kwargs):
print("request.data",request.data)
return self.create(request, *args, **kwargs)
全局视图
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
"DEFAULT_THROTTLE_RATES":{
"visit_rate":"5/m",
},
"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}
备注:局部使用指定解析器时,只需在视图类中添加一个变量:parser_classes = [...]
rest_framework全局默认使用的解析器:
DEFAULTS = {
# Base API policies 'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),
分页
简单分页
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination class PNPagination(PageNumberPagination):
page_size = 1 # 每页显示的数据个数
page_query_param = 'page' #翻页的参数 ?page=num
page_size_query_param = "size" #每页临时显示的数据个数 覆盖page_size
max_page_size = 5 #每页允许显示的最大条数 class BookViewSet(viewsets.ModelViewSet): queryset = Book.objects.all()
serializer_class = BookSerializers
def list(self,request,*args,**kwargs):
# 单写某个视图时的用法
book_list=Book.objects.all()
pp=LimitOffsetPagination()
pager_books=pp.paginate_queryset(queryset=book_list,request=request,view=self)
print(pager_books)
bs=BookSerializers(pager_books,many=True) #return Response(bs.data)
return pp.get_paginated_response(bs.data)
偏移分页
from rest_framework.pagination import LimitOffsetPagination
分页器在视图类中的用法:在视图类中定义一个变量: pagination_class=类
备注:使用LimitOffsetPagination偏移分页,里面的两个参数limit和offset:limit是每页显示的条数,offset是从第几条数据+1开始(offset=3,意为从第四条数据开始)。default_limit = num,默认显示的条数。
游标分页
from rest_framework.views import APIView
from .models import UserInfo
from rest_framework.response import Response
from rest_framework import serializers
from rest_framework.pagination import CursorPagination
class MyPagination(CursorPagination):
# URL传入的游标参数
cursor_query_param = 'cursor'
# 默认每页显示的数据条数
page_size = 2
# URL传入的每页显示条数的参数
page_size_query_param = 'page_size'
# 每页显示数据最大条数
max_page_size = 1000 # 根据ID从大到小排列
ordering = "id"
class PagerSerialize(serializers.ModelSerializer):
'''数据序列化'''
class Meta:
model = UserInfo
fields = "__all__"
depth = 2 #用于显示关联字段的对应的表的详细内容 class PagerView(APIView):
def get(self,request,*args,**kwargs):
user_list=UserInfo.objects.all().order_by('-id') #将数据按照id从大到小排序
#根据url参数,获取分页数据
obj=MyPagination()
page_user_list=obj.paginate_queryset(user_list,request,self) #数据进行序列化
ser=PagerSerialize(instance=page_user_list,many=True)
response=obj.get_paginated_response(ser.data) #返回带上下页连接的数据
return response
# return Response(ser.data) #不含上下页链接
游标方式分页的本质是通过记住当前页面数据的最大、最小id,翻页时根据记录的最大或者最小id,查询下一页对应的数据,这样就不会出现每一次翻页都会重头遍历数据的情况,大大的提高了查询效率。缺点是无法直接跳转到某一页。
url路由器
我们在使用rest_framework时,url都是一个规定的格式,当我们有很多表时,意味着大量的复用一些代码,对于每一个模型表对应的url,只有两个地方不同,一个是路径的前缀,一个是对应的视图类。在rest_framework中也提供了一个url的分发,完美的解决了url的分发。
from rest_framework import routers
rest_framework提供一个routers的py文件,这个文件中包含跟路由相关的类。
使用方式:在routers.py中有一个DefaultRouter类,先实例化一个这个类的对象,router=routers.DefaultRouter(),通过这个router对象,可以将对应的路径和视图类注册:router.register(r"路径前缀",对应的视图类),最后只需将url(r'^', include(router.urls)),这个url加入到urlpatterns中即可。
备注:rest_framework中为我们提供了四种形式的访问方式:
- books/
- books/1/
- books.json/
- books/?format=json 后两种不常用
响应器
rest_framework默认提供给我们两种响应器:
DEFAULTS = {
# Base API policies
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
如果请求是浏览器,就用BrowsableAPIRenderer响应器返回一个页面,如果请求是非浏览器(比如Postman),就使用JSONRenderer响应一个json格式的数据。rest_framework提供这两个响应器是为了利于开发。
我们可以在视图类中配置一个变量:renderer_classes = [JSONRenderer]
from rest_framework.renderers import JSONRenderer
这样我们再使用浏览器发送请求是,响应的是一个json格式的字符串,而不是一个界面。
版本控制
版本控制是由传入的客户端请求决定的,并且可能基于请求URL,或者基于请求头。
restframework也提供了对应的版本控制。当使用版本控制时,request.version属性(字符串)与客户端请求的版本一致。 默认情况下,没有使用版本控制,request.version将会返回None,我们可以通过request.version的值进行判断和逻辑分发.
基于请求url:
class APIView(View):
# 版本控制的默认配置 可以在局部中定义versoning_class=的自定义配置
versioning_class = api_settings.DEFAULT_VERSIONING_CLASS def initial(self, request, *args, **kwargs):
# 版本控制相关
# Determine the API version, if versioning is in use.
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
版本配置
全局配置
1. 添加配置
1
2
3
4
5
6
7
8
9
10
|
REST_FRAMEWORK = { .... 'DEFAULT_VERSIONING_CLASS' : 'rest_framework.versioning.URLPathVersioning' , 'ALLOWED_VERSIONS' :[ 'v1' , 'v2' ], # 允许的版本 'VERSION_PARAM' : 'version' , # 参数 'DEFAULT_VERSION' : 'v1' , # 默认版本 .... } |
2. 设置路由
1
2
3
4
5
6
7
8
9
10
|
BeesCity / urls.py urlpatterns = [ #url(r'^admin/', admin.site.urls), url(r '^api/(?P<version>\w+)/' , include( 'api.urls' )), ] api / urls.py urlpatterns = [ url(r '^course/$' , course.CourseView.as_view()), ] |
3. 传递版本信息
1
|
http: / / 127.0 . 0.1 : 8000 / api / v1 / course / |
4. 获取版本
1
|
request.version 获取版本 |
局部配置
除非明确设置,否则DEFAULT_VERSIONING_CLASS值为None.此例中request.version将会始终返回None
您还可以在一个单独的视图上设置版本控制方案。通常,您不需要这样做,因为在全局范围内使用一个版本控制方案更有意义。如果您确实需要这样做,请使用versioning_class属性。
1
2
3
4
|
from rest_framework.versioning import QueryParameterVersioning class Course(APIView): versioning_class = QueryParameterVersioning |
这个时候可以用过url传参的方式来传递版本信息,如:
1
|
http: / / 127.0 . 0.1 : 8000 / api / course / ?version = 1 |
添加头信息控制版本
在API请求header中添加Accept字段。
Accept的作用是客户端指出响应可以接受的媒体类型
如Accept:application/json; version=v2
具体格式也可以参考下面。
Accept: application/vnd.xxxx[.version].param[+json]
例如Accept: application/vnd.demo.app-v2+json
总结:小版本的更新可通过把版本号作为参数的方式或者通过accept字段标示版本号的方式判断,大的版本更新则通过URL上添加版本号控制
深入解析当下大热的前后端分离组件django-rest_framework系列四的更多相关文章
- 深入解析当下大热的前后端分离组件django-rest_framework系列一
前言 Nodejs的逐渐成熟和日趋稳定,使得越来越多的公司开始尝试使用Nodejs来练一下手,尝一尝鲜.在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展 ...
- 深入解析当下大热的前后端分离组件django-rest_framework系列二
视图三部曲 一部曲 · 使用混合(mixins) 上一节的视图部分: from rest_framework.views import APIView from rest_framework.resp ...
- 深入解析当下大热的前后端分离组件django-rest_framework系列三
三剑客之认证.权限与频率组件 认证组件 局部视图认证 在app01.service.auth.py: class Authentication(BaseAuthentication): def aut ...
- 海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_179 随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依 ...
- 《Spring Boot 入门及前后端分离项目实践》系列介绍
课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发 ...
- SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程01---搭建前端工程
豆宝社区项目实战教程简介 本项目实战教程配有免费视频教程,配套代码完全开源.手把手从零开始搭建一个目前应用最广泛的Springboot+Vue前后端分离多用户社区项目.本项目难度适中,为便于大家学习, ...
- SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程02---创建后端工程
本节代码开源地址 代码地址 项目运行截图 搭建后端工程 0.导入sql 在数据库导入 /* Navicat Premium Data Transfer Source Server : localhos ...
- Docker环境下的前后端分离项目部署与运维
本教程将从零开始部署一个前后端分离的开源项目,利用docker虚拟机的容器技术,采用分布式集群部署,将项目转换成为高性能.高负载.高可用的部署方案.包括了MySQL集群.Redis集群.负载均衡.双机 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
随机推荐
- Linux之根文件系统介绍与分析20160611
说一下LINUX根文件系统的介绍与分析: 1.内核启动应用程序,首先要识别出应用程序,这时就需要文件系统来帮助内核找到对应的应用程序: 2.第一个启动的应用程序就是sbin目录下的init程序,也就是 ...
- BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...
- [solr]solr的安装
solr是什么? 翻译: SolrTM is the popular, blazing fast open source enterprise search platform from the Apa ...
- saltstack:multi-master configuration
官方手册地址:http://docs.saltstack.com/topics/tutorials/multimaster.html 总结起来,有以下几步: Create a redundant ma ...
- CentOS 下安装Mplayer播放器(转载)
一.准备工作 需要的安装包及下载地址:1.mplayer源代码包(MPlayer-1.0rc4.tar.bz2)下载:http://www.mplayerhq.hu/MPlayer/releases/ ...
- [LeetCode] 5. Longest Palindromic Substring ☆☆☆☆
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 【uva12232/hdu3461】带权并查集维护异或值
题意: 对于n个数a[0]~a[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题: I P V :告诉你a[P] = V I P Q V:告诉你a[P] XOR a ...
- 「6月雅礼集训 2017 Day5」学外语
[题目大意] 给出$\{P_i\}$,求经过以下操作后能够得到的不同序列个数: 第一步,选择$i, j$,交换$P_i,P_j$:第二步,把所有$P_x=i$的$P_x$变为$j$,把所有$P_x=j ...
- bzoj 1452: [JSOI2009]Count ——二维树状数组
escription Input Output Sample Input Sample Output 1 2 HINT ———————————————————————————————————————— ...
- Codeforces Round #484 (Div. 2)
题目链接:http://codeforces.com/contest/982 A. Row time limit per test:1 second memory limit per test:256 ...