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.body
xD 谢谢
@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读写)