我有一个使用 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 方面进行了一些尝试,但并没有真正了解这些函数是如何在资源类中使用的,所以我不确定这是否对我来说是正确的策略。提前致谢。