如何在 Flask 中获取 POST 的 JSON?

2024-11-22 08:47:00
admin
原创
5
摘要:问题描述:我正在尝试使用 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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   609  
  在现代项目管理中,资源的有效利用是确保项目成功的关键因素之一。随着技术的不断进步,越来越多的工具和软件被开发出来,以帮助项目经理和团队更高效地管理资源。本文将介绍10款工具,这些工具可以帮助项目团队提升资源利用效率,从而实现项目目标。禅道项目管理软件禅道项目管理软件是一款开源的项目管理工具,广泛应用于软件开发和其他行业...
项目管理系统   3  
  在项目管理领域,软件工具的不断升级和创新是推动效率和协作的关键。2024年,众多项目管理软件将迎来一系列令人期待的升级功能,这些新特性不仅将提升团队的工作效率,还将增强用户体验和数据分析能力。本文将详细介绍10款项目管理软件的最新升级功能,帮助项目经理和团队成员更好地规划和执行项目。禅道项目管理软件禅道项目管理软件一直...
开源项目管理工具   2  
  信创国产系统的10个关键厂商及其技术生态随着全球信息技术格局的不断演变,信创(信息技术应用创新)产业作为国产化替代的重要阶段,正逐步成为推动我国信息技术自主可控、安全可靠的核心力量。信创产业不仅关乎国家信息安全,也是数字经济高质量发展的关键支撑。本文将深入探讨信创国产系统中的10个关键厂商及其技术生态,分析它们在信创浪...
项目管理流程   0  
  在探讨项目管理的广阔领域中,成功并非偶然,而是精心策划、高效执行与持续优化的结果。项目管理的成功之道,可以从明确的目标设定与规划、高效的团队协作与沟通、以及灵活的风险管理与适应变化这三个核心方面进行深入解析。每个方面都是项目成功的基石,它们相互交织,共同支撑起项目的顺利推进与最终成就。明确的目标设定与规划项目管理的首要...
建筑工程项目管理规范   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用