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

服务器网站中Flask+Ajax调用Python脚本仅返回代码未执行问题求助

问题分析与解决方案

看起来你遇到的核心问题是服务器没有将你的Flask脚本当作可执行的Web应用来处理,而是直接返回了Python源代码。这是因为Flask作为Web框架,不能直接通过浏览器访问.py文件来运行,必须通过WSGI服务器(比如Flask自带的开发服务器、Gunicorn等)启动,并且前端Ajax需要请求Flask应用暴露的路由,而非脚本文件本身。

下面分步骤帮你解决:

1. 确认Flask脚本的结构正确性

你的BPRecordsParser.py需要是一个完整的Flask应用,示例结构如下:

from flask import Flask, request, jsonify
# 导入你用于PDF转CSV的工具库,比如pdfplumber、PyPDF2等

app = Flask(__name__)

# 定义处理PDF上传的路由
@app.route('/parse-pdf', methods=['POST'])
def parse_pdf():
    # 获取上传的PDF文件
    pdf_file = request.files.get('pdf_file')
    if not pdf_file or pdf_file.filename == '':
        return jsonify({"status": "error", "message": "未选择有效文件"}), 400
    
    # 这里添加你的PDF转CSV核心逻辑
    # 示例:先保存文件,再执行转换
    # pdf_file.save(f"./temp_uploads/{pdf_file.filename}")
    # csv_content = your_pdf_to_csv_function(f"./temp_uploads/{pdf_file.filename}")
    
    # 模拟转换成功的返回结果(实际项目中替换为真实转换内容)
    csv_content = "姓名,年龄,血压记录\n张三,30,120/80\n李四,28,115/75"
    return jsonify({"status": "success", "csv_data": csv_content})

if __name__ == '__main__':
    # 开发环境用此启动,生产环境请替换为WSGI服务器
    app.run(host='0.0.0.0', port=5000, debug=True)

2. 修正前端Ajax的文件上传逻辑

你之前传递文件名和DataURL的方式不正确,应该用FormData直接传递文件,同时修改请求URL为Flask应用的路由地址,而非.py文件路径:

function readURL(input) {
  if (input.files && input.files[0]) {
    var reader = new FileReader();
    reader.onload = function(e) {
      $(".image-upload-wrap").hide();
      $(".file-upload-image").attr("src", e.target.result);
      $(".file-upload-content").show();
      $(".image-title").html(input.files[0].name);
      
      // 用FormData封装上传的文件
      const formData = new FormData();
      formData.append('pdf_file', input.files[0]);
      
      $.ajax({
        type: "POST",
        // 替换为你的服务器IP+Flask端口+路由,比如http://your-server-ip:5000/parse-pdf
        url: "http://123.45.67.89:5000/parse-pdf",
        data: formData,
        // 这两个参数必须设置,否则FormData无法正确传递
        contentType: false,
        processData: false,
        success: function(response) {
          alert("PDF转换成功!");
          console.log("转换后的CSV内容:", response.csv_data);
          // 这里可以添加CSV下载逻辑,比如生成下载链接
        },
        error: function(xhr) {
          alert(`出错了:${xhr.responseJSON?.message || "未知错误"}`);
        }
      });
    };
    reader.readAsDataURL(input.files[0]);
  } else {
    removeUpload();
  }
}

3. 正确部署Flask应用

开发环境测试

在服务器上运行你的Flask脚本:

python BPRecordsParser.py

这会启动Flask自带的开发服务器,监听5000端口。确保服务器的5000端口对外开放(比如在防火墙添加规则),前端即可通过http://your-server-ip:5000/parse-pdf访问接口。

生产环境部署

开发服务器不适合生产场景,推荐使用Gunicorn+Nginx组合:

  1. 安装Gunicorn:
pip install gunicorn
  1. 启动Gunicorn:
gunicorn -w 4 -b 0.0.0.0:5000 BPRecordsParser:app

(-w 4表示启用4个工作进程,BPRecordsParser:app指向你的脚本文件名和Flask实例名)
3. 配置Nginx反向代理(可选但推荐),用于处理静态文件和稳定转发请求,示例配置:

server {
    listen 80;
    server_name your-domain.com;

    # 转发Flask接口请求
    location /parse-pdf {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 托管前端静态文件(HTML/CSS/JS等)
    location / {
        root /path/to/your/frontend/files;
        index index.html;
    }
}

为什么之前的方法无效?

你直接将./BPRecordsParser.py作为Ajax的URL,服务器会把这个.py文件当作普通静态文本文件,直接返回源代码,而非执行里面的Flask应用逻辑。只有通过WSGI服务器启动Flask应用后,服务器才会将请求转发给Flask,由它处理路由、执行对应代码并返回结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:44:44