第十章 restframework——版本控制

第十章 restframework——版本控制web

 

1、內置的版本控制類django

2、局部使用json

3、全局使用app

4、源碼解析url

 

1、內置的版本控制類spa

導入模塊版本控制

from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning

1.QueryParameterVersioningrest

做用:code

基於url的get傳參方式對象

地址訪問舉例:

/users?version=v1

 

2.AcceptHeaderVersioning

做用:

基於 accept 請求頭方式

地址訪問舉例:

Accept: application/json; version=1.0

 

3.NamespaceVersioning

做用:

基於django路由系統的namespace

地址訪問舉例:

example.com/v1/users/

 

4.URLPathVersioning

做用:

基於url的正則方式

地址訪問舉例:

/v1/users/

urls.py

from django.conf.urls import url, include
from web.views import TestView

urlpatterns = [
    url(r'^(?P<version>[v1|v2]+)/test/', TestView.as_view(), name='test'),
]

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import URLPathVersioning


class TestView(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        # 獲取版本
        print(request.version)
        # 獲取版本管理的類
        print(request.versioning_scheme)

        # 反向生成URL
        reverse_url = request.versioning_scheme.reverse('test', request=request)
        print(reverse_url)
     # 基於django內置,反向生成url
        # from django.urls import reverse
        # url2=reverse(viewname='ttt',kwargs={'version':'v2'})
        # print(url2)
return Response('GET請求,響應內容')

 

5.HostNameVersioning

做用:

基於主機名方法

地址訪問舉例:

v1.example.com

 

2、局部使用

#在CBV類中加入
versioning_class = URLPathVersioning

 

3、全局使用

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',
    'DEFAULT_VERSION': 'v1',            # 默認版本(從request對象裏取不到,顯示的默認值)
    'ALLOWED_VERSIONS': ['v1', 'v2'],   # 容許的版本
    'VERSION_PARAM': 'version'          # URL中獲取值的key
}

 

4、源碼解析

#執行determine_version,返回兩個值,放到request對象裏
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme

def 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)
相關文章
相關標籤/搜索