在Django 2中使用URLPathVersioning处理版本控制

时间:2018-03-31 23:49:08

标签: python django

我最近遇到了一些麻烦,试图将我的REST API设置为使用路径版本。

我的代码在my_app / urls.py中:

def ping():
    return "pong"


API_PREFIX = r'^(?P<version>(v1))'

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(f'^{API_PREFIX}/ping/$', get_json(ping))) # assume that get_json returns the right thing
]

我将这些行添加到同一目录中的settings.py:

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning'
    'DEFAULT_VERSION': 'v1',
    'ALLOWED_VERSIONS': ('v1',),
}

如果我执行GET localhost:8000/v1/ping/,则无效。 f字符串能够包含regex语法还是其他地方的问题?我尝试了fr'^{(API_PREFIX}}/ping/$',但也没有用。

加分问题:在ping函数中,如何访问和检查路径中传递的版本号(在这种情况下为1,但会随时间变化)?

1 个答案:

答案 0 :(得分:1)

我发现了问题。文档中的这一段概述了我所面临的问题;

  

使用未命名的正则表达式组¶以及命名组   语法,例如(?P [0-9] {4}),你也可以使用较短的未命名   组,例如([0-9] {4})。

     

这种用法并不特别推荐,因为它更容易使用   意外地在匹配的预期含义之间引入错误   以及观点的论据。

     

<强>&GT;在任何一种情况下,在给定的正则表达式中仅使用一种样式是   推荐的。当两种样式混合时,任何未命名的组都是   忽略,只将命名组传递给视图函数。