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

django how to place variable in a raw string,such as for URL router

我想写一个url,需要的时候可以配置,例如:

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

settings.py 我设置了一个 APIVERSION = 'api/v1'

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

在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'

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

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

import settings

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

但是,对于一个 API 的多个版本,我猜你会希望它们都同时 posted,这样用户就不会被迫立即升级你什么时候post一个新版本?

在那种情况下,我会使用 include 来引用不同版本并保留所有版本,而不是只指定一个变量。像这样:

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...

@Luca 的回答是正确的,但我会小心破坏您与版本化 URL 的向后兼容性。

我们遇到了类似的情况,最后我们做了一个装饰函数来检查请求路径中 API 的版本。

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

而url会像这样使用正则表达式参数,

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