【问题标题】:How to get data from POST request in Django如何从 Django 中的 POST 请求中获取数据
【发布时间】:2016-03-09 15:27:04
【问题描述】:

我花了很多时间试图从我的 django 1.8 应用程序中的 POST 请求中获取数据,但无论我做什么它都不起作用。希望有更熟练的人提出解决方案。

我需要从请求中获取数据:

curl.exe -X POST --data "Status=OK"  http://localhost:8000/postback

urls.py的相关内容:

url(r'^postback', 'app.views.process_postback'),

views.py的相关内容:

@csrf_exempt
def process_postback(request):
    if request.method == 'POST':
        dict = request.POST
        print(dict)

    return HttpResponse("OK")

我总是在 dict 中得到空值: 我的问题是如何从帖子中获取状态到我的应用程序内部

这里有更多细节:

  1. 我处理来自第三方网站的回发,所以我无法更改 POST 请求的内容
  2. 我不需要(想要)请求的任何表单/模型,我只需要收集 Status 的值。

感谢您的帮助。

【问题讨论】:

  • 代替dict = request.POST,可以试试status = request.POST.get('status')
  • print(request.body) 显示什么?
  • 感谢您的帮助。我尝试了 status = request.POST.get('status'),在该行执行状态等于 None 之后。
  • 我也尝试了 print(request.body) 并得到了异常: File "C:\work\django\postback\postback\env\lib\site-packages\django\http\reque st.py ", line 231, in body raise RawPostDataException("You cannot access body after reading from request's data stream") django.http.request.RawPostDataException: You cannot access body after reading from request's data stream

标签: django


【解决方案1】:

我终于弄清楚出了什么问题。我使用带有 PTVS(Visual Studio 的 Python 工具)的 VS 2013 作为我的开发环境。似乎如果项目在调试器下启动,那么 http 请求就会被搞砸。如果我在没有调试器的情况下运行项目,那么一切正常。我试图查看调试器代码(C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.2\visualstudio_py_debugger.py)但没有找到一些明显的东西导致这样的行为。如果有人遇到它并且知道如何解决它,那就太好了。

【讨论】:

  • 在使用 VS Code 调试 Django 应用程序时也会发生这种情况。 VS Code 调试器出于某种原因去除了 POST 参数。
【解决方案2】:

关注https://superuser.com/questions/149329/what-is-the-curl-command-line-syntax-to-do-a-post-request

从您的命令中删除 -X POST 选项

curl.exe --data "Status=OK"  http://localhost:8000/postback

输出:

<QueryDict: {u'Status': [u'OK']}>
[04/Dec/2015 21:03:15] "POST /postback HTTP/1.1" 200 2

pip freeze 输出:

Django==1.8.6

【讨论】:

  • 感谢您回答我的问题。我知道 -X POST 有点多余,如果存在数据选项,那么 curl 无论如何都会将请求视为 POST。我删除了 -X 选项,结果是一样的:在 process_postback() 请求内部有空的 QueryDict,没有状态信息。
  • 你可能在其他地方有问题。
  • 你可能是对的,我在某个地方有问题,只是不知道在哪里。我将 django 升级到 1.8.6,但仍未获得状态。 Tomasz 我看到你的网站上一切正常。你能把你的项目发给我吗?如果您的代码在我的机器上运行,那么我将能够找出问题所在。希望我没有要求太多。谢谢。
  • 非常感谢 Tomasz,它有效。我想我需要从裸骨项目开始尝试添加东西直到休息。再次感谢。
【解决方案3】:

我使用了 django 1.10.所以我只能给出一些建议。当我想从表单中获取值时,无论是 GET 还是 POST,我都使用了dict=request.POST.get('dict') 第二个 'dict' 是表单的输入名称。例如在 html 中,它应该是 `

<form name="input" method="post">

   <input type="text" name="dict" >

   <input type="submit" value="submit">

</form>`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2012-07-05
    • 2016-11-17
    • 2020-08-15
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多