Django & TastyPie:request.POST 为空
Posted
技术标签:
【中文标题】Django & TastyPie:request.POST 为空【英文标题】:Django & TastyPie: request.POST is empty 【发布时间】:2013-04-19 06:19:20 【问题描述】:我正在尝试使用 curl 进行 POST:
curl --dump-header - -H "Content-Type: application/json" -X POST --data '"item_id": "1"' http://www.mylocal.com:8000/api/1/bookmarks/
但是,request.POST 始终为空。
下面是我的模型资源代码:
class BookmarkResource(ModelResource):
class Meta:
queryset = Bookmark.objects.all()
resource_name = 'bookmarks'
fields = ['id', 'tags']
allowed_methods = ['get', 'post', 'delete', 'put']
always_return_data = True
authorization= Authorization()
include_resource_uri = False
def determine_format(self, request):
return "application/json"
def obj_create(self, bundle, **kwargs):
request = bundle.request
try:
payload = simplejson.loads(request.POST.keys()[0])
except:
payload = simplejson.loads(request.POST.keys())
有人知道我错过了什么吗?
提前致谢。
【问题讨论】:
【参考方案1】:从 Django 1.5 开始,request.POST
不再包含非表单数据。他们现在在request.body
。
https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.POST
【讨论】:
另见***.com/questions/1208067/…。 @dannyroa “表单数据”和“非表单数据”有什么区别? ...查看 Django 源码,它看起来像是在_load_post_and_files()
中定义的,并且依赖于 CONTENT_TYPE
-- multipart/form-data
和 application/x-www-form-urlencoded
【参考方案2】:
我不是 cURL 期望,但从 Chrome 开发工具中复制一个 POST 请求,我的--data
如下所示:
--data "foo=bar&bar=foo"
所以看起来您可能想将命令更改为:
--data item_id="1"
旁注: 我强烈推荐以下任一 Chrome 应用程序来发出 HTTP 请求:
Advanced REST client 或 Dev HTTP Client
此外,如果您可以在浏览器中进行调用(表单提交等),那么在 Chrome 开发工具网络面板中,您可以将请求复制为 cURL 命令(右键单击它)
【讨论】:
您是否尝试过 pdb/ipdb 以查看request
上可用的内容?
是的,我用 ipdb 来追踪它。在 REST 客户端上,我将 Content-Type 设置为“application/json”。
奇怪的是有时它会转到 request.GET。我确定我在做一个 POST。
'"item_id": "1"'
如果有帮助,可以在 bundle.request.body 上找到。会继续挖掘。
你是对的。这是 Django 最近在处理请求方面发生的变化吗?以上是关于Django & TastyPie:request.POST 为空的主要内容,如果未能解决你的问题,请参考以下文章
Django/Tastypie - DELETE 请求删除所有内容
Django RESTful API - django-piston 与 django-tastypie