完全開示:TastypieGoogleGroupにクロス投稿
APIに送信される内容を制御するのが制限されている状況があります。基本的に、POSTデータを受け入れることができるようにする必要がある2つのWebサービスがあります。どちらも、urlencodedデータでプレーンなPOSTアクションを使用します(基本的に基本的なフォーム送信)。
「カール」の用語で考えると、次のようになります。
curl --data "id=1&foo=2" http://path/to/api
私の問題は、POSTを使用してレコードを更新できないことです。したがって、IDが指定されている場合、POSTがPOSTではなくPUTとして機能するように、モデルリソースを調整する必要があります(私は信じています)。
api.py
class urlencodeSerializer(Serializer):
formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencoded']
content_types = {
'json': 'application/json',
'jsonp': 'text/javascript',
'xml': 'application/xml',
'yaml': 'text/yaml',
'html': 'text/html',
'plist': 'application/x-plist',
'urlencoded': 'application/x-www-form-urlencoded',
}
# cheating
def to_urlencoded(self,content):
pass
# this comes from an old patch on github, it was never implemented
def from_urlencoded(self, data,options=None):
""" handles basic formencoded url posts """
qs = dict((k, v if len(v)>1 else v[0] )
for k, v in urlparse.parse_qs(data).iteritems())
return qs
class FooResource(ModelResource):
class Meta:
queryset = Foo.objects.all() # "id" = models.AutoField(primary_key=True)
resource_name = 'foo'
authorization = Authorization() # only temporary, I know.
serializer = urlencodeSerializer()
urls.py
foo_resource = FooResource
...
url(r'^api/',include(foo_resource.urls)),
)
Freenodeの#tastypieで、Ghost []は、モデルリソースに関数を作成してpost_list()を上書きすることを提案しましたが、まだこれを使用することに成功していません。
def post_list(self, request, **kwargs):
if request.POST.get('id'):
return self.put_detail(request,**kwargs)
else:
return super(YourResource, self).post_list(request,**kwargs)
残念ながら、この方法は私にはうまくいきません。より大きなコミュニティがこの問題のガイダンスまたは解決策を提供できることを願っています。