如何在 Flask 中获取 POST 的 JSON?

2024-11-22 08:47:00
admin
原创
186
摘要:问题描述:我正在尝试使用 Flask 构建一个简单的 API,现在我想在其中读取一些 POST 的 JSON。我使用 Postman Chrome 扩展程序进行 POST,我 POST 的 JSON 很简单{"text":"hello world"}。我尝试使用以下方法...

问题描述:

我正在尝试使用 Flask 构建一个简单的 API,现在我想在其中读取一些 POST 的 JSON。我使用 Postman Chrome 扩展程序进行 POST,我 POST 的 JSON 很简单{"text":"hello world"}。我尝试使用以下方法读取 JSON:

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print(content)
    return uuid

在浏览器上,它正确返回我在 GET 中输入的 UUID,但在控制台上,它只是打印出来None(我希望它打印出来{"text":"hello world"}。有人知道如何从 Flask 方法中获取发布的 JSON 吗?


解决方案 1:

首先,.json属性是一种委托给request.get_json()方法的属性,这记录了您None在这里看到的原因。

您需要将请求内容类型设置为,application/json以使.json属性和.get_json()方法(无参数)正常工作,否则将产生结果None。请参阅FlaskRequest文档:

解析后的 JSON 数据若mimetype指示 JSON(application/json,请参阅.is_json)。

您可以request.get_json()通过传递force=True关键字参数来跳过内容类型要求。

请注意,如果此时出现异常(可能导致 415 Unsupported Media Type 响应),则您的 JSON数据无效。它在某种程度上是格式错误的;您可能需要使用 JSON 验证器进行检查。

解决方案 2:

作为参考,下面是如何从 Python 客户端发送 json 的完整代码:

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print(res.json())

“json=”输入将自动设置内容类型,如下所述:如何使用 Python 请求发布 JSON 数据?

上述客户端将与该服务器端代码一起工作:

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

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print(content['mytext'])
    return jsonify({"uuid":uuid})

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)

解决方案 3:

我会这样做,也应该这样做

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    # print(content) # Do your processing
    return uuid

使用silent=Trueset 后,get_json函数在尝试检索 json 主体时将默默失败。默认情况下,此设置为False。如果您始终期望 json 主体(不是可选的),请将其保留为silent=False

设置force=True将忽略
request.headers.get('Content-Type') == 'application/json'flask 为您执行的检查。默认情况下,这也设置为False

参见Flask 文档。

我强烈建议离开force=False并让客户端发送Content-Type标题以使其更加明确。

解决方案 4:

假设您已经发布了具有application/json内容类型的有效 JSON,request.json将具有已解析的 JSON 数据。

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/echo', methods=['POST'])
def hello():
   return jsonify(request.json)

解决方案 5:

对于那些问题来自 ajax 调用的人来说,这里有一个完整的例子:

Ajax 调用:这里的关键是使用dict然后JSON.stringify

    var dict = {username : "username" , password:"password"};

    $.ajax({
        type: "POST", 
        url: "http://127.0.0.1:5000/", //localhost Flask
        data : JSON.stringify(dict),
        contentType: "application/json",
    });

在服务器端:

from flask import Flask
from flask import request
import json

app = Flask(__name__)

@app.route("/",  methods = ['POST'])
def hello():
    print(request.get_json())
    return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 

if __name__ == "__main__":
    app.run()

解决方案 6:

如果您使用force=True,它将忽略请求的内容类型并尝试将正文解析为 JSON。

request.get_json(force=True)

解决方案 7:

您可能会注意到,仅当在请求的标头中添加了时request.json,或才有效。如果您无法更改客户端请求配置,则可以像这样获取 JSON 格式的正文:request.get_json()`Content-type: application/json`

data = json.loads(request.data)

解决方案 8:

给出另一种方法。

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

@app.route('/service', methods=['POST'])
def service():
    data = json.loads(request.data)
    text = data.get("text",None)
    if text is None:
        return jsonify({"message":"text not found"})
    else:
        return jsonify(data)

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)

解决方案 9:

可以使用如下代码:

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
  content = request.json['text']
  print content
  return uuid

下面是我获取json数据的截图:

在此处输入图片描述

可以看到返回的是字典类型的数据。

解决方案 10:

假设您已发布有效的 JSON,

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['uuid']
    # Return data as JSON
    return jsonify(content)

解决方案 11:

尽管我在这里遇到的所有答案都是正确的。但我认为应该做一些事情作为更好的做法。以下是我写的方法。

from flask import app, request, Flask, jsonify


@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    
    # Check if the request method is POST
    if request.method == 'POST':
        # content will return eather parse data as JSON
        # Or None incase there is no data
        content = request.get_json()
        print(content)
        # The content could be displayed in html page if serialized as json
        return jsonify(content) # Return null if there is content

    # if it is only get request then just return uuid
    return uuid

解决方案 12:

{
  "uuid":1212121212,
  "text":"lalala",
  "comment":"",
  "signed_on":"2022-11-07 00:03:00"
}

您可以将上述数据作为 json 发送,然后使用 request.json 在 flask 应用程序中获取它

from flask import request, Blueprint,flash,json

@app.route('/api/add_message/<uuid>', methods = ["GET", "POST"])
def testing(uuid):
    sync_data = request.json    
    josn_data = json.dumps(sync_data ,default =str)
    return josn_data

解决方案 13:

尝试按照方法设置force属性来解决此问题。True`get_json()`

request.get_json(force = True)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1259  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理理念和方法,在提升企业创新能力方面发挥着至关重要的作用。它打破了传统产品开发过程中部门之间的壁垒,通过整合资源、优化流程,实现产品的快速、高效开发,为企业在激烈的市场竞争中赢得优势。IPD流程管理的核心概念IPD流程...
IPD流程中PDCP是什么意思   11  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品的高效、高质量开发。在这一过程中,团队协作无疑是成功的关键。有效的团队协作能够打破部门壁垒,促进信息共享,提升决策效率,从而确保产品开发项目顺利推进。接下来,我们将深入探讨IPD流...
IPD培训课程   9  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发理念和方法,在众多企业中得到了广泛应用。它旨在打破部门壁垒,整合资源,实现产品开发的高效、协同与创新。在项目周期方面,IPD研发管理体系有着深远且多维度的影响,深入剖析这些影响,对于企业优化产品开发流程、提升市场竞争...
华为IPD流程   11  
  IPD(Integrated Product Development)流程管理是一种先进的产品开发管理模式,旨在通过整合企业的各种资源,实现产品的高效、高质量开发。它涵盖了从产品概念提出到产品退市的整个生命周期,对企业的发展具有至关重要的意义。接下来将详细阐述IPD流程管理的五个阶段及其重要性。概念阶段概念阶段是IPD...
IPD概念阶段   12  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用