DRF Django REST framework 之 路由器与版本控制组件(七)
路由器
一些Web框架提供了用于自动确定应如何将应用程序的URL映射到处理传入请求的逻辑的功能。
而DRF的路由器组件也提供了一种简单,快速且一致的方式将视图逻辑映射到一组URL上。
路由器组件的使用配合include
第一步:导入模块
- from rest_framework import routers
第二步:实例化一个router对象
- router = routers.SimpleRouter()
第三步:将需要自动生成url的接口注册到router中
- router.register('books', views.BookView)
第四步:生成url
- urlpatterns = [
- re_path('', include(router.urls)),
- ]
路由器简单的使用
- from rest_framework import routers
- router = routers.SimpleRouter()
- router.register('books', BookView)
- router.register('users', UserView)
- urlpatterns = router.urls
register 方法有两个强制性参数:
- prefix - 用于这组路由的URL前缀。
- viewset - 视图集类。
(可选)其他参数:
- basename - 用于创建的URL名称的基础。如果未设置,则基名称将基于
queryset
视图集的属性自动生成(如果有)。 - 请注意,如果视图集不包含
queryset
属性,则必须basename
在注册视图集时进行设置。
在使用路由组件之前的url:
- urlpatterns = [
- path("books/", views.BookView.as_view({
- "get": "list",
- "post": "create",
- })),
- re_path('books/(?P<pk>\d+)/', views.BookView.as_view({
- 'get': 'retrieve',
- 'put': 'update',
- 'delete': 'destroy'
- })),
- ]
使用路由器之后的url:
- router = routers.DefaultRouter()
- router.register("books", views.BookView)
- urlpatterns = [
- re_path('', include(router.urls)),
- ]
可以发现简单了很多~
版本控制
API版本控制,可以更改不同客户端之间的行为方式。REST框架提供了许多不同的版本控制方案例如:
某些客户端 使用低版本只维护不开发新功能 v1
主要的产品还要不断的更新迭代功能 v2
API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。 DRF提供了许多不同的版本控制方案。
DRF提供版本控制的五种方案
rest_framework 框架里的 versioning.py 文件
- class BaseVersioning:
- pass
- # 将版本信息放到请求头中
- class AcceptHeaderVersioning(BaseVersioning):
- """
- GET /something/ HTTP/1.1
- Host: example.com
- Accept: application/json; version=1.0
- """
- pass
- # 将版本信息放到URL中
- class URLPathVersioning(BaseVersioning):
- """
- To the client this is the same style as `NamespaceVersioning`.
- The difference is in the backend - this implementation uses
- Django's URL keyword arguments to determine the version.
- An example URL conf for two views that accept two different versions.
- urlpatterns = [
- url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
- url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
- ]
- GET /1.0/something/ HTTP/1.1
- Host: example.com
- Accept: application/json
- """
- pass
- # 将版本信息放在命名空间 namespace
- class NamespaceVersioning(BaseVersioning):
- """
- To the client this is the same style as `URLPathVersioning`.
- The difference is in the backend - this implementation uses
- Django's URL namespaces to determine the version.
- An example URL conf that is namespaced into two separate versions
- # users/urls.py
- urlpatterns = [
- url(r'^/users/$', users_list, name='users-list'),
- url(r'^/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
- ]
- # urls.py
- urlpatterns = [
- url(r'^v1/', include('users.urls', namespace='v1')),
- url(r'^v2/', include('users.urls', namespace='v2'))
- ]
- GET /1.0/something/ HTTP/1.1
- Host: example.com
- Accept: application/json
- """
- pass
- # 将版本信息放在主机名里 Host
- class HostNameVersioning(BaseVersioning):
- """
- GET /something/ HTTP/1.1
- Host: v1.example.com
- Accept: application/json
- """
- pass
- # 将版本信息放在URL 查询参数里
- class QueryParameterVersioning(BaseVersioning):
- """
- GET /something/?version=0.1 HTTP/1.1
- Host: example.com
- Accept: application/json
- """
- pass
版本控制的使用
以URL为例:
设计 url :
- router = routers.DefaultRouter()
- router.register("books", views.BookView)
- urlpatterns = [
- # 给url设置参数
- re_path('(?P<version>[v1|v2]+)/', include(router.urls)),
- ]
局部使用
导入模块,使用就行了
- from rest_framework.versioning import URLPathVersioning
- class BookView(ModelViewSet):
- # 指定版本控制类,固定写法
- versioning_class = URLPathVersioning
- # 获取数据源, 固定写法
- queryset = models.Book.objects.all()
- # 序列化类, 固定写法
- serializer_class = BookSerializer
全局使用
以 URLPathVersioning 为例,还是在项目的 settings.py 中 REST_FRAMEWORK 配置项下配置:
- REST_FRAMEWORK = {
- # 配置默认使用的版本控制类
- 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
- # 默认的版本
- 'DEFAULT_VERSION': 'v1',
- # 有效的版本
- 'ALLOWED_VERSIONS': ['v1', 'v2'],
- # 版本的参数名与URL conf中一致
- 'VERSION_PARAM': 'version',
- }
这样在视图中就可以通过访问 request.version 来获取当前请求的具体版本,然后根据不同的版本来返回不同的内容:
我们可以在视图中自定义具体的行为,下面以不同的版本返回不同的序列化类为例:
- class BookViewSet(ModelViewSet):
- # 获取数据源,固定写法
- queryset = models.Book.objects.all()
- # 指定序列化类,固定写法
- serializer_class = BookModelserializer
- # 只要配置了版本,在视图中就能通过 request.version 获得当前版本号
- def get_serializer_class(self):
- # 获取当前序列化类的方法
- # 根据版本的不同返回不同的序列化类
- if self.request.version == 'v1':
- return BookSerializerVersion1
- return BookModelserializer
自定义
要实现自定义版本控制,请继承 BaseVersioning 并重写 determine_version 方法。
- class MyVersion(versioning.BaseVersioning):
- def determine_version(self, request, *args, **kwargs):
- return request.META.get('version', None)
这样就能在局部或全局使用了!
~>.<~
DRF Django REST framework 之 路由器与版本控制组件(七)的更多相关文章
- 轻轻松松学会 DRF Django REST framework
据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...
- Django rest framework(4)----版本
目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django res ...
- DRF Django REST framework APIView(一)
什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...
- DRF Django REST framework 之 解析器(二)
引入 Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据 ...
- DRF (Django REST framework) 中的Request 与 Response
DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...
- DRF (Django REST framework) 中的视图类
视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...
- DRF Django REST framework 之 序列化(三)
Django 原生 serializer (序列化) 导入模块 from django.core.serializers import serialize 获取queryset 对queryset进行 ...
- DRF Django REST framework 之 认证组件(五)
引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...
- Django REST framework 渲染器、版本
渲染器.版本: # settings.py REST_FRAMEWORK = { "DEFAULT_RENDERER_CLASSES": [ "rest_framewor ...
随机推荐
- hdu 1385 Minimum Transport Cost (Floyd)
Minimum Transport CostTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- 搭建Nginx正向代理服务
需求背景: 前段时间公司因为业务需求需要部署一个正向代理,需要内网服务通过正向代理访问到外网移动端厂商域名通道等效果,之前一直用nginx做四层或者七层的反向代理,正向代理还是第一次配置,配置的过程也 ...
- 力扣(LeetCode)学生出勤记录I 个人题解
给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤记录中不超过一个' ...
- ZeroC ICE的远程调用框架 AMD
继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...
- PL真有意思(五):数据类型
前言 现在大多数程序设计语言中都有表达式和/或对象的类型概念.类型起着两种主要作用: 为许多操作提供了隐含的上下文信息,使程序员可以在许多情况下不必显示的描述这种上下文.比如int类型的两个对象相加就 ...
- Three.js - 走进3D的奇妙世界
本文将通过Three.js的介绍及示例带我们走进3D的奇妙世界. 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第6期-支付结算部支付研发团队前端研发高级工程师-刘琳<three. ...
- 基于Galera Cluster多主结构的Mysql高可用集群
Galera Cluster特点 1.多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的 2.同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 3.并发复制:从 ...
- centos7 安装wps
# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # cat /proc/version Linux version 3.1 ...
- Vue.js 控制css样式
<script src="https://unpkg.com/vue/dist/vue.js"></script> <style type=" ...
- ThinkPHP5——模型(model)的使用
在使用ThinkPHP5的过程中,我经常使用db进行数据库操作的,后来接触到了模型(model),刚使用时感觉跟db没啥区别,后来查官网知道模型基类中还提供了较多的其他的方法可以方便使用例如获取器.修 ...