You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:09:00