Django和TastyPie:request.POST为空

18

我正在尝试使用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总是为空。

以下是我的ModelResource代码:

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())

有人知道我错过了什么吗?

提前感谢。

2个回答

67

请参见https://dev59.com/XXM_5IYBdhLWcg3w1G6N。 - Seth
2
@dannyroa “表单数据”和“非表单数据”有何不同之处? - rrauenza
1
从Django源代码来看,它似乎是在_load_post_and_files()中定义的,并且依赖于CONTENT_TYPE——multipart/form-dataapplication/x-www-form-urlencoded - rrauenza

1

我不是cURL的专家,但从Chrome开发工具中复制POST请求,我的--data如下:

--data "foo=bar&bar=foo"

因此,您可能需要将命令更改为:

--data item_id="1"

顺便提一下: 我强烈推荐以下任一Chrome应用程序来进行HTTP请求:

高级REST客户端 OR Dev HTTP Client

此外,如果您可以在浏览器中进行调用(例如表单提交等),则在Chrome开发工具网络面板中,您可以将请求复制为cURL命令(右键单击它)。


是的,我使用了 ipdb 来进行跟踪。在 REST 客户端上,我将 Content-Type 设置为“application/json”。 - dannyroa
奇怪的是有时它会转到request.GET。我确保我正在进行POST请求。 - dannyroa
如果有帮助的话,'{"item_id": "1"}' 可以在 bundle.request.body 中找到。我会继续查找。 - rockingskier
看起来这是与Django 1.5相关的更改。request.POST不再包含非表单数据。https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.POST - dannyroa
啊,好发现。另外,如果你只是将JSON映射到模型,那么你不需要创建一个obj_create方法。 - rockingskier
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接