1

我有一个使用 Tastypie 生成其 RESTful API 的 Django 后端。此 API 的端点不位于域的顶层;相反,它通过使用 WSGIScriptAlias 存在于“子文件夹”位置。大多数情况下,这很好用。但是我发现当我的一个资源具有 ToManyField 关系时,Tastypie 会抛出一个错误。这是我的一些相关代码。WSGIScriptAlias 行:

WSGIScriptAlias /english/rubric /var/webapps/django/rubric/apache/django.wsgi

来自有问题的资源的片段:

class TraitResource(ModelResource):
    criteria = fields.ToManyField('rubric.rubric.api.CriterionResource', "criteria", related_name='trait', full = True)

    class Meta:
         queryset = Trait.objects.all()
         authentication=SessionAuthentication()
         list_allowed_methods=['get']
    always_return_data=True

class CriterionResource(ModelResource):

    class Meta:
        queryset = Criterion.objects.all()
        authentication=SessionAuthentication()
        list_allowed_methods=['get']
    always_return_data=True

我的 urls.py:

v1_api = Api(api_name='v1')
v1_api.register(TraitResource())
v1_api.register(CriterionResource())

urlpatterns = patterns('',  
    (r'^login/$', 'django_cas.views.login'),
    (r'^logout/$', 'django_cas.views.logout'),
    (r'^api/', include(v1_api.urls))
)

错误消息的片段:

{
error_message: "{'path': u'english/rubric/api/v1/rubric', 'tried': [[<RegexURLPattern None ^login/$>], [<RegexURLPattern None ^logout/$>], [<RegexURLResolver [<RegexURLPattern api_v1_top_level ^(?P<api_name>v1)/?$>, <RegexURLResolver [<RegexURLPattern api_dispatch_list ...

(它从那里继续列出它尝试过但未能找到匹配的所有 URL)。

因此,如果我理解正确,正在发生的事情是,由于我的 WSGIScriptAlias,相关对象将它们的完整路径报告为资源 URI,但是当美味派去获取相关对象以返回我调用的对象时,它们不匹配 urls.py 中的任何内容(因为它只需要相对于 WSGI 应用程序挂载点的 url 模式)。我已经通过临时修改 WSGIScriptAlias 验证了这种情况,因此 API 位于根目录 - 然后一切正常。那么我需要做什么才能将其与子文件夹 URL 模式保持一致?我已经在覆盖 prepend_urls 和 get_resource_uri 方面进行了一些尝试,但并没有真正了解这些函数是如何在资源类中使用的,所以我不确定这是否对我来说是正确的策略。提前致谢。

4

1 回答 1

0

你用的是什么版本的tasyypie?

我有同样的问题,似乎可以通过从 0.9.12 升级到 0.9.15 来解决。

于 2013-05-10T13:21:55.147 回答