我想写一个可以在需要时配置的网址,例如:
url(r'^api/v1/books/',include('article.urls'))
在 settings.py 中设置了APIVERSION = 'api/v1'
我想将APIVERSION
放入该网址以使其可配置,如何做到这一点,是否有最佳方法来实现这一目标?
答案 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...