django如何将变量放在原始字符串中,例如用于URL路由器

时间:2015-04-12 17:58:01

标签: python django django-urls

我想写一个可以在需要时配置的网址,例如:

url(r'^api/v1/books/',include('article.urls'))

settings.py 中设置了APIVERSION = 'api/v1'

我想将APIVERSION放入该网址以使其可配置,如何做到这一点,是否有最佳方法来实现这一目标?

3 个答案:

答案 0 :(得分:2)

在urls.py中:

from django.conf import settings

urlpattern = patterns('',
    url(settings.APIVERSION, include(
            url(r'/books/',include('article.urls'),
    )
)

在settings.py中:

APIVERSION = r'^api/v1'

您还可以使用变量来避免嵌套包含。

答案 1 :(得分:2)

@ Luca的答案是对的,但我会小心打破你对版本化网址的向后兼容性。

我们有类似的情况,我们最终做了一个装饰器函数,它检查请求路径中的API版本。

#supports can be optional and defaults to current version
@check_version(supports="v1")
def view_function(...:

url将使用这样的正则表达式参数,

^/api/v(?P<version>\d+)/

答案 2 :(得分:1)

您可以使用字符串连接,如下所示:

import settings

url(settings.APIVERSION + r'/books', include('article.urls'))

但是,对于多个版本的API,我猜你会希望它们同时发布,所以当你发布新版本时,用户不会被迫立即升级吗?

在这种情况下,我会使用includes来引用差异版本并保留所有这些版本,而不是仅指定一个的变量。像这样:

urlpatterns = patterns('',
   url(r'/api/v1/books', include('api.v1.articles.urls')),
   url(r'/api/v2/books', include('api.v2.articles.urls')),
   url(r'/api/v3/books', include('api.v3.articles.urls')),
   ..
)

或者,如果要处理请求处理程序代码中的映射,可以将值作为变量拉出

urlpatterns = patterns('',
    url(r'/api/v(?P<api_version>\d+)/books', 'articles.books.handler')
)

这会在你的处理函数中给你一个命名变量来引用。它看起来像这样:

def handler(request, api_version):
   ... do something here...