rest_frameworkフレーム - バージョンコントロールアセンブリ

APIのバージョンが異なるクライアントで異なる動作の使用を制御するために使用することができます。RESTフレームワークは、設計の異なるバージョンの数を提供します。

バージョン管理は、クライアントの要求によって決定を渡され、リクエストURLに基​​づいてもよいし、要求に基づいて、ヘッダ。

rest_framework

バージョン管理、request.version属性(文字列)は、クライアント要求のバージョンと一致しているとき。
デフォルトでは、バージョン管理、request.versionはNoneを返します

 versioning_class = api_settings.DEFAULT_VERSIONING_CLASS
    
    # APIView
    def initial(self, request, *args, **kwargs):
        """
        Runs anything that needs to occur prior to calling the method handler.
        """
        self.format_kwarg = self.get_format_suffix(**kwargs)

        # Perform content negotiation and store the accepted info on the request
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg

        # Determine the API version, if versioning is in use.
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme

    
    def determine_version(self, request, *args, **kwargs):
        """
        If versioning is being used, then determine any API version for the
        incoming request. Returns a two-tuple of (version, versioning_scheme)
        """
        if self.versioning_class is None:
            return (None, None)
        scheme = self.versioning_class()
        return (scheme.determine_version(request, *args, **kwargs), scheme)

明示的に常にNoneを返しますDEFAULT_VERSIONING_CLASS値なし。Request.versionにそうでない場合は、この例を設定しない限り、
あなたはまた、バージョン管理プログラム上の別のビューを設定することができます。バージョン管理スキームの使用が地球規模でより理にかなっているので、一般的には、必要性、そうではありません。あなたが本当にこれを実行する必要がある場合は、versioning_classプロパティを使用してください。

from rest_framework.versioning import QueryParameterVersioning

class VersionTestAPI(APIView):
    
    versioning_class = QueryParameterVersioning

rest_frameworkの.versioningにおけるバージョン管理の5種類

class AcceptHeaderVersioning(BaseVersioning):
    """
    GET /something/ HTTP/1.1
    Host: example.com
    Accept: application/json; version=1.0
    """
    pass
    
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
    
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
    
class HostNameVersioning(BaseVersioning):
    """
    GET /something/ HTTP/1.1
    Host: v1.example.com
    Accept: application/json
    """
    pass
    
class QueryParameterVersioning(BaseVersioning):
    """
    GET /something/?version=0.1 HTTP/1.1
    Host: example.com
    Accept: application/json
    """
    pass

URLPathVersioningにたとえば、

  1. 構成設定を追加します。
INSTALLED_APPS = [
    ...
'VersionDemo'
    ...
]

REST_FRAMEWORK = {    
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
    'ALLOWED_VERSIONS':['v1','v2'], # 允许的版本
    'VERSION_PARAM':'version', # 参数      #  1
    'DEFAULT_VERSION':'v1', # 默认版本
      }

2.urlルーティング構成

urls.py

urlpatterns = [ re_path('api/(?P<version>[v1|v2]+)/', include('api.urls')), name='users-list']  # 2
    
    
api/urls.py

urlpatterns = [ path('test/', views.VersionTestView.as_view()),]
  1. バージョン情報の転送
http://127.0.0.1:8000/api/v1/test/
  1. バージョンを取得します。
request.version                 #  获取版本 

異なるバージョンに基づいて異なる振る舞い

class VersionTestView(APIView):

    def get(self,request,version):      # 3      1,2,3处参数要保持一至,这里均为version
        if request.version == 'v2':
            return Response({'data':'v2'})
        return Response({'data':'v1'})

URLを変更して、どのように、ルックアップ逆にします

from rest_framework.reverse import reverse
reverse('users-list', request=request)

逆関数は、要求のURLのいずれかのバージョンを変換するために適用されます。

- NamespacedVersioning:類似した名前空間

'v1:users-list'

おすすめ

転載: www.cnblogs.com/notfind/p/12043710.html