如何编写Flask代理端点实现跨机器调用原有接口并返回相同响应
现有实现的问题
/info2接口问题:未透传上游/info所需的files_number、directory查询参数,手动拼接URL也容易出现特殊字符转义错误,返回响应未透传正确的状态码和响应头。/file2接口问题:- 上游
/file接收的参数名为file_path而非path,参数名不匹配会导致上游无法正确拿到文件路径 - 硬编码端口
5905灵活度差 - 上游
send_file返回的是二进制文件流,不能用req.json()解析,会直接抛出异常 - 没有透传文件的响应头(如Content-Type、Content-Disposition),会导致下载文件名错误、文件格式识别异常
- 上游
正确实现代码
首先安装依赖:pip install flask requests
import requests from flask import Flask, request, jsonify, Response app = Flask(__name__) # 代理info接口,和上游返回完全一致 @app.route('/info2', methods=['GET']) def get_info2(): # 拿取必要的上游地址参数 ip = request.args.get('ip') port = request.args.get('port') if not ip or not port: return jsonify({"error": "ip and port are required"}), 400 # 透传所有上游需要的查询参数,默认值和上游保持一致 params = { "files_number": request.args.get('files_number', 5), "directory": request.args.get('directory', 'C:\Admin') } try: resp = requests.get( f'http://{ip}:{port}/info', params=params, timeout=10 ) # 透传状态码、响应内容、响应头,保证返回和上游完全一致 return Response( resp.content, status=resp.status_code, headers=dict(resp.headers) ) except Exception as e: return jsonify({"error": str(e)}), 500 # 代理file接口,完全透传文件流和响应头 @app.route('/file2', methods=['GET']) def get_file2(): ip = request.args.get('ip') # 保留默认端口同时支持自定义传入,兼顾原有使用习惯和灵活性 port = request.args.get('port', 5905) file_path = request.args.get('file_path') directory = request.args.get('directory', 'C:\Admin') if not ip or not file_path: return jsonify({"error": "ip and file_path are required"}), 400 params = { "file_path": file_path, "directory": directory } try: resp = requests.get( f'http://{ip}:{port}/file', params=params, stream=True, # 大文件流式传输避免内存溢出 timeout=30 ) # 过滤传输层专有头,避免代理异常 excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection'] headers = { name: value for name, value in resp.headers.items() if name.lower() not in excluded_headers } # 透传文件流、状态码、响应头 return Response( resp.iter_content(chunk_size=1024), status=resp.status_code, headers=headers ) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
核心实现逻辑说明
- 所有上游接口需要的参数全部透传,参数名、默认值都和上游保持一致
- 不手动拼接URL参数,用requests的
params参数自动处理特殊字符转义,避免路径带特殊字符时请求失败 - 文件接口采用流式传输,避免大文件占满代理服务器内存
- 直接透传上游的状态码和响应头,保证返回结果和直接调用上游完全一致
- 增加参数校验和异常捕获,避免服务无理由崩溃
内容的提问来源于stack exchange,提问作者Ginny
相关产品推荐
相关产品推荐

