当前位置: 首页 > 面试题库 >

Flask中没有POST请求和内容类型“ application / json”的响应

单于高逸
2023-03-14
问题内容

我在Flask视图中遇到问题,该视图应返回内容类型为“ application / json”的响应以响应POST请求。具体来说,如果我这样做:

curl -v -d 'foo=bar' http://example.org/jsonpost

对此视图:

@app.route('/jsonpost', methods=['GET', 'POST'])
def json_post():
    resp = make_response('{"test": "ok"}')
    resp.headers['Content-Type'] = "application/json"
    return resp

我得到某种连接重置:

* About to connect() to example.org port 80 (#0)
*   Trying xxx.xxx.xxx.xxx... connected
* Connected to example.org (xxx.xxx.xxx.xxx) port 80 (#0)
> POST /routing/jsonpost HTTP/1.1
> User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: example.org
> Accept: */*
> Content-Length: 7
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 200 OK
< Server: nginx/1.2.4
< Date: Thu, 27 Dec 2012 14:07:59 GMT
< Content-Type: application/json
< Content-Length: 14
< Connection: keep-alive
< Set-Cookie: session="..."; Path=/; HttpOnly
< Cache-Control: public
<
* transfer closed with 14 bytes remaining to read
* Closing connection #0
curl: (18) transfer closed with 14 bytes remaining to read

如果相反,我这样做:

curl -d 'foo=bar' http://example.org/htmlpost

至:

@app.route('/htmlpost', methods=['GET', 'POST'])
def html_post():
    resp = make_response('{"test": "ok"}')
    resp.headers['Content-Type'] = "text/html"
    return resp

我得到了预期的全面答复(200 ok)

{"test": "ok"}

顺便说一句,如果我将GET请求发送到同一JSON路由:

curl http://example.org/jsonpost

我也得到了预期的答复。


问题答案:

感谢Audrius的评论,我找到了uWSGI和nginx之间交互的问题的可能根源:显然,如果您在请求中收到POST数据,则 必须先
读取它,然后再返回响应。

例如,这解决了我的问题。

@app.route('/jsonpost', methods=['GET', 'POST'])
def json_post():
    if request.method == 'POST':
        dummy = request.form
    resp = make_response('{"test": "ok"}')
    resp.headers['Content-Type'] = "application/json"
    return resp

如[uWSGI的作者Roberto DeIoris]--post-buffering1所述,一种不同的解决方案涉及传递给uWSGI。

我仍然不明白为什么问题不会在Content-Type设置为"text/html"



 类似资料:
  • 下面是我的Ajax请求: 如果我没有精确的内容类型,我就无法再看到Firebug的请求。相反,当我添加内容类型时,我可以看到POST请求(由于我的URL是false而出现错误),但在我的头中,内容类型默认是URL编码的表单。 我想要的是通过JSON数据发送表单的详细信息。谢谢你的帮助

  • 问题内容: 我有一个烧瓶应用程序,具有以下视图: 但是,这仅在请求的内容类型设置为时才有效,否则dict 为None。 我知道请求主体为字符串,但我不想每次客户端忘记设置请求的内容类型时都将其解析为字典。 有没有办法假设每个传入请求的content- type是?我想要的就是始终访问有效的字典,即使客户端忘记将应用程序的内容类型设置为json。 问题答案: 使用并设置为: 从文档中: 默认情况下,

  • 我在代码中调用一个rest终结点,该终结点返回一个简单的字符串true或false。我已经将我的Spring靴升级到2.4。下面的代码现在抛出一个异常。 org.springframework.web.client.未知内容类型异常:无法提取响应:在org.springframework.web.client.HttpMessageConverterExtractor.extract数据(Http

  • 我已经通过邮递员发送了标题Content-Type=Application/x-www-form-urlencoded的POST请求。 我得到了PHP中的数组,格式如下。我无法在PHP页面中访问。我该如何解决这个问题? 结果是

  • 我试图得到下面给出的带有SpringRest模板的响应实体。我得到了下面的错误, 代码: 我在这篇文章中尝试将媒体类型设置为Application/json。但还是一样的错误。 完整跟踪:

  • 嗨,有人能帮我处理这个错误吗?当我使用邮递员发送邮件请求时,这里是我的控制器 这就是我使用postman发送json的方式 我正在尝试搜索如何修复它,但错误仍然存在 编辑:这是邮递员的标题 提前致谢