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-dataapplication/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

Django-Tastypie 过滤所有字段

如何通知应用程序凭据在 Django/Tastypie/REST 中成功

Django Tastypie,运行一个动作

包含过滤条件的 Django-tastypie REST url