1. 程式人生 > >框架之開發中的版本傳遞問題

框架之開發中的版本傳遞問題

框架之開發中的版本傳遞問題

一、通過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地址

  1. 獲取處理版本的物件資訊:request.versioning_scheme
  2. 反向獲取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原理