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

在Flask中访问传入的POST数据

凌照
2023-03-14
问题内容

这是flask代码:

from flask import Flask, request
import json
app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def refresh():
    params = {
        'thing1': request.values.get('thing1'),
        'thing2': request.values.get('thing2')
    }
    return json.dumps(params)

这是cURL

$ curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'                                              
> {"thing1": "1", "thing2": null}

$ curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'                                              
> {"thing1": "1", "thing2": null}

该文档似乎非常清楚这应该工作:

形成

包含来自POST或PUT请求的已解析表单数据的MultiDict。请记住,文件上传不会在此处结束,而是在files属性中结束。

args

具有查询字符串的已解析内容的MultiDict。(URL中问号后的部分)。

价值观

一个同时包含form和args内容的CombinedMultiDict。

有什么想法我做错了吗?

更新:尝试从答案之一中提出建议,换return行:

使用会return json.dumps(json.load(request.body.decode("utf-8") ))产生错误AttributeError: 'Request' object has no attribute 'body'

使用会return json.dumps(json.load(request.json))产生错误AttributeError: 'NoneType' object has no attribute 'read'

使用POST与原点代码出现没有任何效果:

$ curl -XPOST 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
{"thing1": "1", "thing2": null}

设置内容类型并POST与原始代码一起使用也没有明显的效果:

$ curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}' 
{"thing1": "1", "thing2": null}

尽管我去验证了内容类型是否正确设置:

...
print(request.headers)
...

Host: 127.0.0.1:5000
User-Agent: curl/7.54.0
Accept: */*
Content-Type: application/json
Content-Length: 12

问题答案:

你无意间发送了错误的Content Type。

默认情况下,curl的-d标志将发送content-type的POST数据application/x-www-form-urlencoded。由于你没有以期望的格式(key = value)发送数据,因此它将完全删除数据。对于JSON数据,你需要发送内容类型设置为application/json如下的HTTP请求:

curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'

另外,flaskrequest.form字段仅包含POST表单数据,而不包含其他内容类型。你可以使用request.data或更方便地使用解析的JSON数据访问原始POST请求主体request.get_json

下面是示例的固定版本:

from flask import Flask, request
import json
app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def refresh():
    params = {
        'thing1': request.values.get('thing1'),
        'thing2': request.get_json().get('thing2')
    }
    return json.dumps(params)


app.run()

更新:我之前打错了 request.body实际上应该是request.data。事实证明request.json它已被弃用,request.get_json现在应改为使用。原始帖子已更新。



 类似资料:
  • 问题内容: 我正在尝试在Express中编写一个愚蠢的简单Hello World程序,该程序输出有关当前HTTP请求的一些基本数据。 对于POST请求,我想查看原始POST正文。 当我关闭来自邮递员的任何类型的POST请求时,设置为。为什么是空的?如何打印原始POST数据?我不需要POST正文的解析版本,只需原始数据即可。 问题答案: 为了读取发布请求的正文,您需要body-parser。 如果您

  • 问题内容: 我似乎无法弄清楚如何使用WSGI访问POST数据。我在wsgi.org网站上尝试了该示例,但没有成功。我现在正在使用Python3.0。请不要推荐WSGI框架,因为这不是我想要的。 我想弄清楚如何将其放入fieldstorage对象。 问题答案: 假设您试图将POST数据仅获取到FieldStorage对象中:

  • 如何通过JSTL将数据打印到页面? 在上图中,我正在向控制器发送一个帖子。现在我可以轻松地访问查询字符串参数,例如将打印出测试参数。 但我不确定如何访问请求有效载荷中的数据。我尝试了${requestScope}对象,但数据似乎不在那里。 我不知道有多相关,但我使用Angular的进行调用。

  • 问题内容: 我有一个应用程序,它基本上是服务的代理。该应用程序本身是在Jersey上构建的,由Jetty提供。我有这个资源方法: 用户提交POST表单。所有POST请求都通过此方法。除了一个细节外,UriInfo和HttpServletRequest被适当地注入:似乎没有参数。这是我从终端发送的请求: 此处的POST正文显然包含两个参数:foo和biz。但是,当我尝试在代码()中获取它们时,结果是

  • 我有一个应用程序,基本上是一个服务的代理。该应用程序本身是基于Jersey构建的,由Jetty提供服务。我有这个资源方法: 用户提交POST表单。所有POST请求都通过此方法。UriInfo和HttpServletRequest被适当地注入,除了一个细节:似乎没有参数。这是我从终端发送的请求: 这里,POST正文显然包含两个参数:foo和biz。但当我尝试在代码中获取它们时(),结果是一个大小为0

  • 问题内容: 我的POST方法看起来像这样: 当我在Netbeans中创建Jersey客户时,调用post方法的方法如下所示: 运行此测试时: 它在服务器中提供以下输出: 我需要更改什么才能使参数给出正确的值? 问题答案: 你的方法应该接受JSON对象而不是字符串。Jersey使用JAXB支持封送和拆封JSON对象(有关详细信息,请参阅jersey文档)。创建一个类似的类: 然后,你的方法将如下所示