Tastypie を使用して RESTful API を生成する Django バックエンドがあります。この API のエンドポイントは、ドメインの最上位にはありません。むしろ、WSGIScriptAlias を使用して「サブフォルダー」の場所に存在します。ほとんどの場合、これで問題なく動作します。しかし、私のリソースの 1 つに 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 としてフル パスを報告しているのに、tastypie が関連するオブジェクトを取得しようとすると、私が呼び出したオブジェクトが返されます。それらは urls.py の何にも一致しません (WSGI アプリのマウント ポイントに関連する URL パターンのみが必要なため)。WSGIScriptAlias を一時的に変更して、API がルートに配置されるようにすることで、これが事実であることを確認しました。その後、すべて正常に動作します。では、サブフォルダーの URL パターンを保持するにはどうすればよいでしょうか? prepend_urls と get_resource_uri の両方をオーバーライドして少し遊んでみましたが、これらの関数がリソース クラスでどのように使用されているかを実際には理解していないため、それが正しい戦略であるかどうかはわかりません。前もって感謝します。