Django REST framework
是一個基于
Django
的架構,
REST framework
又是怎麼
反向生成url
的呢??
在前面的例子中,知道在
REST framework
中有6種版本控制的方式,進入任意一種版本控制的源碼中,
class QueryParameterVersioning(BaseVersioning):
"""
GET /something/?version=0.1 HTTP/1.1
Host: example.com
Accept: application/json
"""
invalid_version_message = _('Invalid version in query parameter.')
def determine_version(self, request, *args, **kwargs):
version = request.query_params.get(self.version_param, self.default_version)
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
return version
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
url = super(QueryParameterVersioning, self).reverse(
viewname, args, kwargs, request, format, **extra
)
if request.version is not None:
return replace_query_param(url, self.version_param, request.version)
return url
可以看到每一個版本控制的類中也都有
reverse
方法,由此可以了
REST framework
也是使用
reverse
的方式來反向生成url
建立一個Django項目,在項目的app中導入
rest-framework
在
settings.py
檔案中做如下配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'VERSION_PARAM': "version",
'DEFAULT_VERSION': 'V1',
'ALLOWED_VERSIONS': ['v1', 'v2']
}
在urls.py檔案中添加路由資訊
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^(?P<version>\w+)/users/$',views.UsersView.as_view(),name="test1"),
]
views.py
檔案中定義
UserView
的類
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning
class UsersView(APIView):
def get(self,request,*args,**kwargs):
# 列印版本資訊
print("request.version:",request.version)
# reverse方法有一個viewname參數,在這裡定義為urls.py中定義的name
print(request.versioning_scheme.reverse("test1",request=request))
return HttpResponse("aaaa")
此時,在浏覽器中輸入
http://127.0.0.1:8000/v1/users/
,在服務端背景列印資訊如下
request.version: v1
http://127.0.0.1:8000/v1/users/
再把浏覽器中的url更換為
http://127.0.0.1:8000/v2/users/
,服務端背景的列印資訊又變成了
request.version: v2
http://127.0.0.1:8000/v2/users/
可以看到列印出了正确的版本,并且反向生成url也已經成功了