在restful规范中,后端的API中需要体现版本。如果项目比较大,需要些很多的视图类,在每一个类中都写一遍会比较麻烦,所以drf中也支持了全局配置。在每个版本处理的类中还定义了`reverse`方法,他是用来反向生成URL并携带相关的的版本信息用的。
python
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传递参数
python
REST_FRAMEWORK={
"UNAUTHENTICATED_USER": None,
"VERSION_PARAM":"version", # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里修改,例如改为"v";
"DEFAULT_VERSION":"v1", # 默认版本
"ALLOWED_VERSIONS":["v1","v2"] #支持的版本范围
}
2、urls.py
python
urlpatterns = [
# path('admin/', admin.site.urls),
path('home/', views.HomeView.as_view(),name="hh"),
]
3、views.py
python
from rest_framework.versioning import QueryParameterVersioning
class HomeView(APIView):
# 传递过程中可以携带版本信息
# http://127.0.0.1:8000/home/?version=v1 ,会自动读出版本赋值给request.version
versioning_class = QueryParameterVersioning
def 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
python
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"),
]
python
REST_FRAMEWORK={
"UNAUTHENTICATED_USER": None,
"VERSION_PARAM":"version", # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里,修改;
"DEFAULT_VERSION":"v1", # 默认版本
"ALLOWED_VERSIONS":["v1","v2"] #支持的版本范围
}
3、views.py
python
from rest_framework.versioning import URLPathVersioning
class HomeView(APIView):
# 传递过程中可以携带版本信息
# http://127.0.0.1:8000/home/?version=v1 ,会自动读出版本赋值给request.version
versioning_class = URLPathVersioning
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("...")
三、基于请求头传递参数
1、urls.py
python
urlpatterns = [
# 基于请求头传递参数
path('api/home/', views.HomeView.as_view(), name="hh"),
]
2、views.py
python
from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning,AcceptHeaderVersioning
class HomeView(APIView):
versioning_class = AcceptHeaderVersioning
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("...")
四、在实际项目中,第二种通过URL传递版本号的方式还是比较常用,在使用的时候,可以通过全局配置,在views中就不需要在引入和单独设置了,可以直接使用,案例如下:
python
REST_FRAMEWORK={
# 版本号传递全局设置
"VERSION_PARAM":"version", # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里,修改;
"DEFAULT_VERSION":"v1", # 默认版本
"ALLOWED_VERSIONS":["v1","v2"], #支 持的版本范围
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
}
2、urls.py
python
# 基于URL传递参数
path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),
3、views.py
python
from rest_framework.views import APIView
from rest_framework.response import Response
class 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("...")