You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python Flask API中解析POST请求及提取Immutable字典关键键值

解决Flask中解析带JSON文件的POST请求及Immutable字典处理问题

嘿,我来帮你搞定这个解析POST请求和提取Immutable字典键值的问题!下面是一步步的实用解决方案:

1. 接收并解析multipart/form-data中的JSON文件

你的POST请求是multipart格式,里面包含一个名为eventData的文本文件,内容是JSON结构。在Flask里,我们需要通过request.files获取这个文件对象,再读取并解析成Python字典:

from flask import Flask, request, jsonify
import json

app = Flask(__name__)

@app.route('/process-event', methods=['POST'])
def process_event():
    # 获取上传的eventData文件
    event_file = request.files.get('eventData')
    
    # 先检查文件是否存在
    if not event_file:
        return jsonify({"error": "请求中缺少'eventData'文件"}), 400
    
    try:
        # 读取文件内容并解析为JSON字典
        event_data = json.load(event_file)
    except json.JSONDecodeError:
        return jsonify({"error": "'eventData'文件中的JSON格式无效"}), 400
    
    # 到这里event_data就是普通Python字典了,接下来可以提取需要的键值

2. 提取嵌套的键值对

你的JSON结构是多层嵌套的,用get()方法提取更安全(避免直接索引导致KeyError),示例如下:

# 提取顶层的Rule字段
rule = event_data.get("Rule")

# 提取Alert列表中的第一个Event对象
alert_list = event_data.get("Alert", [])
if alert_list:
    first_event = alert_list[0].get("Event", {})
    event_uuid = first_event.get("EventUUID")
    sensor_uuid = first_event.get("SensorUUID")
    event_type = first_event.get("Type")
    
    # 这里可以根据业务需求处理这些数据,比如打印、存储等
    print(f"收到事件ID: {event_uuid}, 来自传感器: {sensor_uuid}")

3. 处理Immutable字典的情况

Flask里的request.formrequest.args这类对象默认是ImmutableMultiDict类型,无法直接修改或按普通字典操作。遇到这种情况,只需转成普通字典即可:

  • 转换request.form这类Immutable对象:
normal_dict = dict(request.form)
# 或者用内置的to_dict()方法
normal_dict = request.form.to_dict()
  • 若解析后的JSON意外变成Immutable(这种情况很少见),同样可以用dict()包裹转换:
event_data = dict(json.load(event_file))

完整示例代码

把上面的逻辑整合起来,完整的Flask接口代码如下:

from flask import Flask, request, jsonify
import json

app = Flask(__name__)

@app.route('/process-event', methods=['POST'])
def process_event():
    # 获取文件
    event_file = request.files.get('eventData')
    if not event_file:
        return jsonify({"error": "缺少'eventData'文件"}), 400
    
    # 解析JSON
    try:
        event_data = json.load(event_file)
    except json.JSONDecodeError:
        return jsonify({"error": "eventData文件中的JSON格式错误"}), 400
    
    # 提取数据
    rule = event_data.get("Rule")
    alert_list = event_data.get("Alert", [])
    event_info = {}
    
    if alert_list:
        first_event = alert_list[0].get("Event", {})
        event_info = {
            "event_uuid": first_event.get("EventUUID"),
            "sensor_uuid": first_event.get("SensorUUID"),
            "event_type": first_event.get("Type")
        }
    
    # 返回响应
    return jsonify({
        "status": "success",
        "rule": rule,
        "event_details": event_info
    }), 200

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

这样就能完美处理你的POST请求,顺利提取需要的键值啦!

内容的提问来源于stack exchange,提问作者Daniel

火山引擎 最新活动