Django req.POST 总是返回 False

Posted

技术标签:

【中文标题】Django req.POST 总是返回 False【英文标题】:Django req.POST always returns False 【发布时间】:2019-07-20 07:52:30 【问题描述】:

我正在测试 shipstation webhook,但我似乎无法从他们发送的 POST 请求中获取数据。

他们的 webhook docs 说他们的 POST 请求将包含如下所示的正文:

"resource_url":"https://ssapiX.shipstation.com/orders?storeID=123456&importBatch=1ab23c4d-12ab-1abc-a1bc-a12b12cdabcd","resource_type":"ORDER_NOTIFY"

为了调试这个问题,我进入了 Firefox 并尝试发送这个:

得到了同样的结果; req.method = 'POST'req.POST = False

myNgrokAddress.ngrok.io/bot/shipstation 的视图控制器:

@csrf_exempt
def vc(req):
    print(req.META) //this works but it looks like meta-data for my browser and not from shipstation
    print(req.POST.get('resource_url')) //prints false
    print(req.POST) //prints false


    return HttpResponse('')

当我转到localhost:4040(ngrok 检查员)时,POST 正文出现了,所以我的 django 服务器上一定有一些错误配置。

我在 settings.py 中设置了ALLOWED_HOSTS = ['myNgrokAdress.ngrok.io', 'localhost']。我还有什么需要做的吗?

我在这里缺少什么?

【问题讨论】:

这可能与 HTTPS 请求的特殊性有关吗?只是吐口水 没错,req.POST 是请求中的 POST headers,而不是请求的内容。 更具体地说,如果我这样做了,我记得需要有一个证书才能呈现给服务器 @Willem 我认为你不正确,因为 django 请求文档说 req.POST 从请求中返回一个 queryDict 对象。话虽这么说,你让我意识到数据类型不是 queryDict,我应该只使用 req.bodyxD 谢谢 @Jane:这正是我的意思:它只是从请求中获取 headers,而不是正文。当然 Django 把它变成一个对象。我在哪里可以说明? 【参考方案1】:

问题出在req.POST 方法上。

来自Django docs:

HttpRequest.POST:

一个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据。请参阅下面的 QueryDict 文档。如果您需要访问请求中发布的原始数据或非表单数据,请改为通过 HttpRequest.body 属性访问。

由于要发送的数据类型是非形式数据,因此您需要使用req.body

【讨论】:

以上是关于Django req.POST 总是返回 False的主要内容,如果未能解决你的问题,请参考以下文章

Python入门自学进阶-Web框架——10Django-应用COOKIESESSION和装饰器,及FBVCBV概念

Python入门自学进阶-Web框架——10Django-应用COOKIESESSION和装饰器,及FBVCBV概念

Linux下开发python django程序(Session读写)

Linux下开发python django程序(Cookie读写)

Django Tastypie 总是返回 401 未经授权

Django 惰性机制