框架之開發中的版本傳遞問題
框架之開發中的版本傳遞問題
一、通過get傳參的方式
1.自定義接收引數類
class ParamVersion(object): def determine_version(self, request, *args, **kwargs): version = request.query_params.get('version') return version class UsersView(APIView): versioning_class = ParamVersion # 注意:這裡接收引數的類是一個,所以class為單數,後邊的類只能有一個 def get(self, request, *args, **kwargs): print(request.version) # 通過引數類返回的version資訊直接封裝在request中,可以通過request.version來獲取 return Response("詳情頁面")
2.使用框架封裝好的元件來實現
在檢視檔案中設定引數的接收,這裡需呀匯入QueryParameterVersioning類
from rest_framework.versioning import QueryParameterVersioning class UsersView(API): versioning_class = QueryParameterVersioning def get(self, request, *args, **kwargs): print(request.version) return Response("詳情頁面")
在settings.py檔案中對提交的版本資訊進行設定
REST_FRAMEWORK = [ 'DEFAULT_VERSION': 'V1', # 當開發者不傳遞引數時預設的版本號 'ALLOWED_VERSIONS': ['V1', 'V2', 'V3'], # 整個開發過程中允許使用的版本號 'VERSION_PARAM': 'version' # 當傳遞版本資訊時,版本值對應的key值,即 ?version=V1 ]
二、將版本資訊寫入到url中
這個方式需要用到的是URLPathVersioning類
url路由的分配
urlpatterns = [ path('users/<slug: version>/', views.UsersView.as_view()), 注意:2.0版本以後再傳遞的變數如果是str用到的是slug ]
檢視類設定
from rest_framework.versioning import URLPathVersioning class UsersView(APIView): versioning_class = URLPathVersioning def get(self, request, *args, **kwargs): print(request.version) return Response("詳情頁面")
傳遞版本資訊的設定和get中的全域性設定是一樣的,預設版本號、允許的版本列表、版本key
Note
需要注意的是,開發者可以正向的傳遞版本資訊,程式也可以反向的獲取url地址
- 獲取處理版本的物件資訊:request.versioning_scheme
- 反向獲取url: request.versioning_scheme.reverse(viewname='url的別名', request=request)
三、Django 2.0 url()到path()速查表
2018年5月2日丹尼爾·赫珀DJANGO的,WEB開發
Django 2.0引入了一種定義URL的新方法,該方法大大簡化了如何捕獲引數。
在早期版本的Django中,您必須使用該url()方法並傳遞帶有命名捕獲組的正則表示式來捕獲URL引數。
url(r'^posts/(?P
path('posts/
尖括號(
路徑轉換器不僅易於閱讀,而且還帶來了一個新功能:路徑轉換器可以在將引數傳遞給檢視之前將引數轉換為適當的型別。
早期版本的Django只是將匹配的字串傳遞給檢視,這意味著您必須編寫以下程式碼:
url(r'^posts/(?P<post_id>[0-9]+)/$', post_detail_view)
def post_detail_view(request, post_id):
post_id = int(post_id)
...
從Django 2.0開始,您只需編寫以下程式碼:
path('posts/<int:post_id>')
def post_detail_view(request, post_id):
...
Django 2.0隨附五個內建轉換器:
- str
匹配任何非空字串,但路徑分隔符“ /”除外。如果表示式中不包含轉換器,則為預設設定。
示例:'best_product_ever!-123.html'
返回字串(str)。
等效正則表示式:[^/]+ int
匹配零或任何正整數。
示例:'1234'
返回一個整數(int)。
等效正則表示式:[0-9]+slug
匹配由ASCII字母或數字以及連字元和下劃線字元組成的任何字串。
返回字串(str)。
示例:'building-your-1st-django-site'
等效正則表示式:[-a-zA-Z0-9_]+uuid
匹配格式化的UUID。為防止多個URL對映到同一頁面,必須包括破折號並且字母必須小寫。
返回一個UUID例項(uuid.UUID)。
示例:'075194d3-6885-417e-a8a8-6c931e272f00'
等效正則表示式:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}path
匹配任何非空字串,包括路徑分隔符“ /”。這使您可以與完整的URL路徑進行匹配,而不僅僅是與str一樣的URL路徑的一部分。
示例:'/path/to/file'
返回字串(str)。
等效正則表示式:'.+'
如果預定義的路徑轉換器不適合需求,則可以註冊自定義路徑轉換器,這可以完成一些技巧,例如將URL引數直接轉換為模型例項。另外,您仍然可以使用re_path()代替來使用良好的ol'正則表示式path()。
from django.urls import re_path
re_path(r'posts/(?P<post_id>[0-9]+)/$', post_detail_view)
順便說一句,舊url()功能仍然可用,因此現在無需更改所有URL定義。
新path()方法極大地簡化了URL處理。我與Django合作已有10多年了,至今仍然不記得如何定義命名的正則表示式捕獲組。此外,手動執行型別轉換會違反DRY原理