全面披露:交叉发布到 Tastypie Google Group
我有一种情况,我对发送到我的 api 的内容的控制有限。本质上,我需要能够接受来自的 POST 数据的两个 Web 服务。两者都使用带有 urlencoded 数据的普通 POST 操作(本质上是基本表单提交)。
用“卷曲”术语思考它就像:
curl --data "id=1&foo=2" http://path/to/api
我的问题是我无法使用 POST 更新记录。所以我需要调整模型资源(我相信),这样如果指定了 ID,则 POST 充当 PUT 而不是 POST。
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()
网址.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)
不幸的是,这种方法对我不起作用。我希望更大的社区可以为这个问题提供一些指导或解决方案。
注意:我无法覆盖来自客户端的标头(根据:http ://django-tastypie.readthedocs.org/en/latest/resources.html#using-put-delete-patch-in-unsupported-places )