2015-04-12 37 views

回答

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' 

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

+0

这很酷,这也正是我want.Thanks什么。 –

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

非常详尽,我应该阅读文档更多 –

2

@卢卡的答案是正确的,但我会小心打破与版本化URL的向后兼容性。

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

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

和URL会使用正则表达式的参数就是这样,

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

是的,它似乎更灵活和安全。谢谢 –

相关问题