我想写需要时可以配置一个URL,例如:的Django如何放置变量原始字符串,如URL路由器
url(r'^api/v1/books/',include('article.urls'))
在settings.py我设置APIVERSION = 'api/v1'
我想将APIVERSION
放入该网址以使其可配置,如何做到这一点,是否有最佳方法实现该目标?
我想写需要时可以配置一个URL,例如:的Django如何放置变量原始字符串,如URL路由器
url(r'^api/v1/books/',include('article.urls'))
在settings.py我设置APIVERSION = 'api/v1'
我想将APIVERSION
放入该网址以使其可配置,如何做到这一点,是否有最佳方法实现该目标?
在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的多个版本的情况下,我猜你会希望他们都贴在同一时间,因此用户在发布新版本时不会被迫立即升级?
在这种情况下,我会使用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...
非常详尽,我应该阅读文档更多 –
@卢卡的答案是正确的,但我会小心打破与版本化URL的向后兼容性。
我们有类似的情况,我们最终做了一个装饰器函数,它检查请求路径中API的版本。
#supports can be optional and defaults to current version
@check_version(supports="v1")
def view_function(...:
和URL会使用正则表达式的参数就是这样,
^/api/v(?P<version>\d+)/
是的,它似乎更灵活和安全。谢谢 –
这很酷,这也正是我want.Thanks什么。 –