部署Flask应用至Azure时遭遇文件上传内部服务器错误求助
问题描述
通过GitHub将Flask Web应用部署至Azure平台后,遇到文件处理异常:前端可正常打开并上传.xlsm文件,但点击提交后出现「Internal Server Error」。本地127.0.0.1:5000运行完全正常,云端部署后Flask接口无法读取、处理上传的文件,推测可能是文件保存路径的访问权限问题,尝试用tempfile.mktemp()临时存储也未解决。
附上核心代码:
from flask import Flask app = Flask(__name__) @app.route('/process', methods=['POST']) def process(): if 'file_policy' not in request.files: ("No file part") return render_template('output.html',filename='File not found') else: file = request.files['file_policy'] app.config['UPLOAD_FOLDER']='.' filename = secure_filename(file.filename) path=os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(path) output=(pd.read_excel('path', sheet_name='Input')) #to check if the file is correctly saved print(path) print(output) result=subprocess.run(['python', 'Motor_Tool_2.py', os.path.join(app.config['UPLOAD_FOLDER'], filename), path], capture_output=True, text=True, cwd=os.getcwd()) return render_template('output.html', filename='path')
解决思路
修复代码低级错误
- 代码多处用字符串
'path'替代变量path:pd.read_excel('path')和render_template('output.html', filename='path')需改为变量path,否则会尝试读取名为"path"的不存在文件。 - 补充缺失的导入模块:代码用到
request、secure_filename、os、pd(pandas)、subprocess、render_template,需在开头添加:from flask import Flask, request, render_template from werkzeug.utils import secure_filename import os import pandas as pd import subprocess
- 代码多处用字符串
适配Azure文件系统权限与路径
- Azure App Service的当前工作目录(
.)可能无写入权限,建议改用系统临时目录:app.config['UPLOAD_FOLDER'] = os.environ.get('TEMP', '.') - 生成唯一文件名避免覆盖:
from datetime import datetime filename = f"{datetime.now().strftime('%Y%m%d%H%M%S')}_{secure_filename(file.filename)}"
- Azure App Service的当前工作目录(
排查subprocess调用问题
- Azure环境中
python可能指向Python2,建议用当前解释器路径:import sys result=subprocess.run([sys.executable, 'Motor_Tool_2.py', path, path], capture_output=True, text=True, cwd=os.getcwd()) - 检查
Motor_Tool_2.py是否在当前工作目录,或提供完整路径;打印result.stderr捕获脚本执行错误。
- Azure环境中
开启日志定位具体错误
- 在代码中添加异常捕获并记录日志:
@app.route('/process', methods=['POST']) def process(): try: # 原代码逻辑 except Exception as e: app.logger.error(f"处理文件出错: {str(e)}") return render_template('output.html', filename=f"错误: {str(e)}") - 查看Azure App Service的日志流(Log Stream),获取「Internal Server Error」的具体触发原因。
- 在代码中添加异常捕获并记录日志:
内容的提问来源于stack exchange,提问作者naz panjwani
相关产品推荐
相关产品推荐

