框架之开发中的版本传递问题

框架之开发中的版本传递问题

一、通过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//', 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 [0-9]+)/$', post_detail_view)
在Django 2.0中,您将该path()方法与路径转换器一起使用以捕获URL参数。

path('posts/ /', post_detail_view)
path()总是匹配完整的路径,path('account/login/')等同于url('^account/login/$')。

尖括号( )中的部分捕获了传递给视图的URL参数。冒号(post_id)后面的部分定义参数的名称,冒号(int)前面的部分命名路径转换器。

路径转换器不仅易于阅读,而且还带来了一个新功能:路径转换器可以在将参数传递给视图之前将参数转换为适当的类型。

早期版本的Django只是将匹配的字符串传递给视图,这意味着您必须编写以下代码:

url(r'^posts/(?P[0-9]+)/$', post_detail_view)

def post_detail_view(request, post_id):
    post_id = int(post_id)
...

从Django 2.0开始,您只需编写以下代码:

path('posts/')

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[0-9]+)/$', post_detail_view)

顺便说一句,旧url()功能仍然可用,因此现在无需更改所有URL定义。

新path()方法极大地简化了URL处理。我与Django合作已有10多年了,至今仍然不记得如何定义命名的正则表达式捕获组。此外,手动执行类型转换会违反DRY原理。

你可能感兴趣的:(框架之开发中的版本传递问题)