一:版本控制django
開發階段,一套網站的接口可能不止一套,所以須要在客戶端請求是明確版本,版本控制組件就是解決這個問題的。json
二:drf內置的版本控制類app
內置的類: 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/
三:版本控制類的使用方式網站
局部使用:在視圖類中配置(在須要使用版本控制的視圖類中加入變量versioning_class = 版本控制的類)url
versioning_class=URLPathVersioning
全局使用:在settings中配置spa
REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning', 'DEFAULT_VERSION': 'v1', # 默認版本(從request對象裏取不到,顯示的默認值) 'ALLOWED_VERSIONS': ['v1', 'v2'], # 容許的版本 'VERSION_PARAM': 'version' # URL中獲取值的key }
四:基於正則的版本控制示例:版本控制
urls.pyrest
"""versioning URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from app01.views import VersionTest urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^(?P<version>[v1|v2]+)/VersionTest/$', VersionTest.as_view(),name='test'), ]
views.py (在視圖類的方法中能夠取出版本號:request.version)code
from django.shortcuts import render,HttpResponse # Create your views here. from rest_framework.versioning import URLPathVersioning from rest_framework.views import APIView from rest_framework.response import Response class VersionTest(APIView): versioning_class = URLPathVersioning def get(self,request,*args,**kwargs): version = request.version print(version) #版本號 version_class = request.versioning_scheme #獲取版本管理的類 print(version_class) reverse_url = request.versioning_scheme.reverse('test', request=request) #反向生成url print(reverse_url) return Response()