框架之开发中的版本传递问题
框架之开发中的版本传递问题
一、通过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
三、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<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原理。