【WEB服务器】flask 服务器
【背景】需求需要搭建HTTP服务器
【方案】使用flask 搭建简易HTTP服务器
from flask import Flask, request, jsonify from util.logger import flak_log app = Flask(__name__) @app.route('/user_requests_info', methods=['POST']) def user_requests_info(): data = request.get_json(force=True)
# 处理 JSON 解析异常
if data is None: return jsonify({'code': -1, 'msg': 'Invalid JSON'}), 400
# 验证数据的完整性和有效性
if not isinstance(data, dict) or not data.get('required_key'):
return jsonify({'code': -2, 'msg': 'Invalid data'}), 400
flak_log.info("用户请求接口: %s", data) if data: info_queue.put(data) response = {'code': 0,'msg': "success"} flak_log.info("用户请求接口响应: 200") return jsonify(response), 200
# 启动服务器
app.run(host='0.0.0.0', port=5117)
在您提供的 Flask 路由处理函数 user_requests_info
中,存在一些潜在的异常场景以及可以进行优化的地方。以下是详细的异常场景分析和优化建议:
异常场景
- JSON 解析失败:
- 如果客户端发送的不是有效的 JSON 数据,
request.get_json()
将返回None
或引发异常(取决于force=True
是否被设置)。
- 如果客户端发送的不是有效的 JSON 数据,
- 数据为空:
- 即使
request.get_json()
没有引发异常,返回的数据也可能为空字典{}
或None
,这在逻辑上需要处理。
- 即使
- 队列操作失败:
- 如果
info_queue
是一个线程安全队列(如queue.Queue
),但在多线程环境中没有正确处理,可能会引发阻塞或异常。 - 如果队列已满(如果有限制大小),
put
操作可能失败。
- 如果
- 日志记录失败:
- 日志记录可能因为权限问题、磁盘空间不足或其他原因失败。
- 响应生成失败:
- 在返回响应之前,如果 Flask 应用的其他部分(如中间件)出现问题,也可能导致异常。
优化建议
-
处理 JSON 解析异常:
- 使用
request.get_json(force=True, silent=True)
可以避免在解析失败时抛出异常,而是返回None
。然后检查返回值是否为None
。
data = request.get_json(force=True, silent=True) if data is None: return jsonify({'code': -1, 'msg': 'Invalid JSON'}), 400
- 使用
-
数据验证:
- 在将数据放入队列之前,验证数据的完整性和有效性。
if not isinstance(data, dict) or not data.get('required_key'): return jsonify({'code': -2, 'msg': 'Invalid data'}), 400
-
队列异常处理:
- 捕获队列操作中可能发生的异常,并返回适当的错误信息。
1 try: 2 info_queue.put(data, block=False) # 可以设置 block=False 以避免阻塞 3 except queue.Full: 4 return jsonify({'code': -3, 'msg': 'Queue is full'}), 503 5 except Exception as e: 6 flak_log.error("Failed to put data in queue: %s", str(e)) 7 return jsonify({'code': -4, 'msg': 'Internal server error'}), 500
-
日志记录增强:
- 确保日志系统配置正确,捕获并记录所有重要事件和错误。
- 使用异常处理来确保日志记录不会因异常而中断。
-
统一异常处理:
- 使用 Flask 的错误处理机制来统一处理异常。
1 try: 2 info_queue.put(data, block=False) # 可以设置 block=False 以避免阻塞 3 except queue.Full: 4 return jsonify({'code': -3, 'msg': 'Queue is full'}), 503 5 except Exception as e: 6 flak_log.error("Failed to put data in queue: %s", str(e)) 7 return jsonify({'code': -4, 'msg': 'Internal server error'}), 500
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了