2

我正在将我的 API 从 Piston 移植到 TastyPie。我们有现有的客户端,因此我们希望保持 API 的 url 结构相同。

我网站的顶级 urls.py conf 如下所示:

    urlpatterns = patterns('',
          ........LOTS OF STUFF

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

使用 Piston,每个单独的资源都会在 api.urls 中独立注册并添加到 urlpatterns,因此您可能会看到 /v1/deals/ 示例。

现在,我在用 TastyPie 重新创建这个结构时遇到了一些问题。在其顶层,Tastypie Api() 对象的 urlpatterns 需要一个名为“api_name”的捕获组。默认情况下,v1 被硬编码为顶级模式,尽管您可以通过在实例化 Api() 时将“api_name”作为关键字参数传递来覆盖它。

我当前的 api.urls.py 看起来像这样(带有tastepie):

   v1_api = Api()
   v1_api.register(DealResource())

   urlpatterns = patterns('',
       (r'^', include(v1_api.urls)),

)

结果是要为 API 匹配的模式现在是“/v1/v1/[resource_name]/”。

一个问题是我看不到如何从顶级 url conf 中删除 ^v1/'。我们的索引页匹配“^$”,所以我不能只走那条路。

我想我可以只注册单个模型资源,而不是 api 对象。不过,这似乎不是最理想的。我错了吗?

我还考虑过对 Tastypie Api 对象进行子类化并删除“api_name”捕获组。

有什么想法吗?

4

1 回答 1

3

我相信最好的方法仍然是从顶级 urlconf 中删除“v1”前缀。类似于以下内容:

urlpatterns = patterns('',
    ........LOTS OF STUFF
    (r'^$', 'app.views.home_page'),
    (r'', include('api.urls')),
)

这样,空请求将映射到您的主页,而 API 请求将继续到您的api.urls配置。

另一种解决方法是直接将 API url 添加到 urlpatterns 实例:

urlpatterns = patterns('',
    ........LOTS OF STUFF
)

urlpatterns += api.urls.ulrpatterns
于 2011-09-22T20:19:10.463 回答