【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
浙公网安备 33010602011771号