服务器网站中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组合:
- 安装Gunicorn:
pip install gunicorn
- 启动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

