在restful規范中,后端的API中需要體現版本。如果項目比較大,需要些很多的視圖類,在每一個類中都寫一遍會比較麻煩,所以drf中也支持了全局配置。在每個版本處理的類中還定義了`reverse`方法,他是用來反向生成URL并攜帶相關的的版本信息用的。
REST_FRAMEWORK = {"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning", # 處理版本的類的路徑"VERSION_PARAM": "version", # URL參數傳參時的key,例如:xxxx?version=v1"ALLOWED_VERSIONS": ["v1", "v2", "v3"], # 限制支持的版本,None表示無限制"DEFAULT_VERSION": "v1", # 默認版本
}
一、基于GET傳遞參數
1、settings.py
REST_FRAMEWORK={"UNAUTHENTICATED_USER": None,"VERSION_PARAM":"version", # 決定url中版本的參數值;不設置默認也是這個值,可以通過修改這里修改,例如改為"v";"DEFAULT_VERSION":"v1", # 默認版本"ALLOWED_VERSIONS":["v1","v2"] #支持的版本范圍
}
2、urls.py
urlpatterns = [# path('admin/', admin.site.urls),path('home/', views.HomeView.as_view(),name="hh"),
]
3、views.py
from rest_framework.versioning import QueryParameterVersioningclass HomeView(APIView):# 傳遞過程中可以攜帶版本信息# http://127.0.0.1:8000/home/?version=v1 ,會自動讀出版本賦值給request.versionversioning_class = QueryParameterVersioningdef get(self,request):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生產URL:",url)return Response("...")
二、基于路由傳遞參數
1、urls.py
urlpatterns = [# 下面這兩種寫法都可以,一種是基于re_path的路由# path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),re_path(r'^api/(?P<version>\w+)/home/',views.HomeView.as_view(),name="hh"),]
2、settings.py
REST_FRAMEWORK={"UNAUTHENTICATED_USER": None,"VERSION_PARAM":"version", # 決定url中版本的參數值;不設置默認也是這個值,可以通過修改這里,修改;"DEFAULT_VERSION":"v1", # 默認版本"ALLOWED_VERSIONS":["v1","v2"] #支持的版本范圍
}
3、views.py
from rest_framework.versioning import URLPathVersioningclass HomeView(APIView):# 傳遞過程中可以攜帶版本信息# http://127.0.0.1:8000/home/?version=v1 ,會自動讀出版本賦值給request.versionversioning_class = URLPathVersioningdef get(self,request,*args,**kwargs):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生產URL:",url)return Response("...")
三、基于請求頭傳遞參數
1、urls.py
urlpatterns = [# 基于請求頭傳遞參數path('api/home/', views.HomeView.as_view(), name="hh"),
]
2、views.py?
from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning,AcceptHeaderVersioningclass HomeView(APIView):versioning_class = AcceptHeaderVersioningdef get(self,request,*args,**kwargs):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生產URL:",url)return Response("...")
四、在實際項目中,第二種通過URL傳遞版本號的方式還是比較常用,在使用的時候,可以通過全局配置,在views中就不需要在引入和單獨設置了,可以直接使用,案例如下:?
1、settings.py
REST_FRAMEWORK={# 版本號傳遞全局設置"VERSION_PARAM":"version", # 決定url中版本的參數值;不設置默認也是這個值,可以通過修改這里,修改;"DEFAULT_VERSION":"v1", # 默認版本"ALLOWED_VERSIONS":["v1","v2"], #支 持的版本范圍"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
}
2、urls.py
# 基于URL傳遞參數path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),
3、views.py
from rest_framework.views import APIView
from rest_framework.response import Responseclass HomeView(APIView):def get(self,request,*args,**kwargs):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生產URL:",url)return Response("...")