访问 Flask 中传入的 POST 数据

2024-02-11

这是烧瓶代码:

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}

The docs http://flask.pocoo.org/docs/0.12/api/#incoming-request-data看起来非常清楚这应该有效:

form

包含来自 POST 或 PUT 请求的已解析表单数据的 MultiDict。 请记住,文件上传不会在这里结束,但是 相反,在文件属性中。

args

包含查询字符串解析内容的 MultiDict。 (这 URL 中问号后面的部分)。

values

具有 form 和 args 内容的 CombinedMultiDict。

有什么想法我做错了吗?

更新:尝试其中一个答案的建议,替换掉return line:

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

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

Using 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

您无意中发送了错误的信息内容类型 https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types.

默认情况下,curl's -dflag 将发送带有内容类型的 POST 数据application/x-www-form-urlencoded https://curl.haxx.se/docs/manpage.html#-d。由于您没有以期望的格式发送数据(键=值),它完全删除了数据。对于 JSON 数据,您需要发送内容类型设置为的 HTTP 请求application/json像这样:

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

还有烧瓶的request.form字段仅包含POST 表单数据 https://en.wikipedia.org/wiki/POST_(HTTP)#Use_for_submitting_web_forms,而不是其他内容类型。您可以使用以下命令访问原始 POST 请求正文request.data http://flask.pocoo.org/docs/0.12/api/#flask.Request.data或者,更方便的是,使用解析的 JSON 数据request.get_json http://flask.pocoo.org/docs/0.12/api/#flask.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已弃用 http://flask.pocoo.org/docs/0.12/api/#flask.Request.json and request.get_json现在应该使用。原帖已更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 Flask 中传入的 POST 数据 的相关文章

  • Spark MLlib - 训练隐式警告

    我在使用时不断看到这些警告trainImplicit WARN TaskSetManager Stage 246 contains a task of very large size 208 KB The maximum recommend
  • Python:记录垃圾收集器

    我有一个 python 应用程序 有一些性能问题 我想将垃圾收集器的事件 特别是何时调用 添加到我的日志中 是否可以 thanks http docs python org library gc html gc set debug http
  • 底图上的子图

    我有一张英国地图和 121 个地点 每个地点有 3 个值 我想绘制 121 个位置中每个位置的三个值的小条形图 目前 这些值绘制为markersize属性 看起来像这样 密集恐惧症情节 https i stack imgur com 5fv
  • 将 API 数据存储到 DataFrame 中

    我正在运行 Python 脚本来从 Interactive Brokers API 收集金融市场数据 连接到API后 终端打印出请求的历史数据 如何将数据保存到数据帧中而不是在终端中流式传输 from ibapi wrapper impor
  • conda 无法从 yml 创建环境

    我尝试运行下面的代码来从 YAML 文件创建虚拟 Python 环境 我在 Ubuntu 服务器上的命令行中运行代码 虚拟环境名为 py36 当我运行下面的代码时 我收到下面的消息 环境也没有被创建 这个问题是因为我有几个必须使用 pip
  • 为什么我的scoped_session 引发 AttributeError: 'Session' object has no attribute 'remove'

    我正在尝试建立一个系统 将数据库操作优雅地推迟到单独的线程 以避免在 Twisted 回调期间发生阻塞 到目前为止 这是我的方法 from contextlib import contextmanager from sqlalchemy i
  • Pyspark 数据框逐行空列列表

    我有一个 Spark 数据框 我想创建一个新列 其中包含每行中具有 null 的列名称 例如 原始数据框是 col 1 col 2 col 3 62 45 null 62 49 56 45 null null null null null
  • 用Python中的嵌套for循环替换重复的if语句?

    在我编写的下面的代码中 n 4 所以有五个 if 语句 所以如果我想将 n 增加到 比如说 10 那么就会有很多 if 语句 因此我的问题是 如何用更优雅的东西替换所有 if 语句 n p 4 5 number of trials prob
  • 如何修复错误“AttributeError:‘模块’对象在 python3 中没有属性‘客户端’?

    以下是我的代码 import http h1 http client HTTPConnection www bing com 我认为没问题 但是 python 给了我以下错误 AttributeError 模块 对象没有属性 客户端 我想知
  • 如何使用 PySpark 有效地将这么多 csv 文件(大约 130,000 个)合并到一个大型数据集中?

    我之前发布了这个问题并得到了一些使用 PySpark 的建议 如何有效地将这一大数据集合并到一个大数据框中 https stackoverflow com questions 60259271 how can i merge this la
  • 参数验证,Python 中的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 让我们举一个 API 的例子 def get abs directory self path if os path isdir path ret
  • 求解不等式系统时“多项式错误:仅允许使用单变量多项式”

    我想找到以下两个常数的区间cons1 and cons2我写了下面的代码 from sympy import Poly from sympy import Abs from sympy solvers inequalities import
  • numpy.cov() 返回意外的输出

    我有一个 X 数据集 有 9 个特征和 683 行 683x9 我想获取这个 X 数据集和另一个与 X 具有相同形状的数据集的协方差矩阵 我使用np cov originalData generatedData rowvar False 代
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 大型数据集上的 Sklearn-GMM

    我有一个很大的数据集 我无法将整个数据放入内存中 我想在这个数据集上拟合 GMM 我可以用吗GMM fit sklearn mixture GMM 重复小批量数据 没有理由重复贴合 只需随机采样您认为机器可以在合理时间内计算的尽可能多的数据
  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • Laravel 5 Socialite - cURL 错误 77:设置证书验证位置时出错

    我正在 Laravel 5 中使用社交名流来设置 facebook 登录 我仔细按照说明进行操作 直到出现以下错误 cURL error 60 SSL certificate problem unable to get local issu
  • 如何使用Featuretools按列值从单个数据框中的多个列创建特征?

    我正在尝试根据之前的结果来预测足球比赛的结果 我在 Windows 上运行 Python 3 6 并使用 Featuretools 0 4 1 假设我有以下代表结果历史记录的数据框 原始数据框 https i stack imgur com
  • scipysolve_ivp() 中的访问时间步长

    我有一个常微分方程系统 正在使用 scipy 的solve ivp 函数求解 它运行良好 但我在访问每个步骤中使用的时间步时遇到问题 我知道solve ivp 将当前时间传递给用户定义的函数 但我需要使用的时间步长 而不是当前时间 为了解决
  • 从 pandas 数据框中绘制堆积条形图

    我有数据框 payout df head 10 复制以下 Excel 绘图的最简单 最智能和最快的方法是什么 我尝试过不同的方法 但无法让一切都到位 Thanks 如果您只想要一个堆积条形图 那么一种方法是使用循环来绘制数据框中的每一列 并

随机推荐