Gunicorn部署Flask应用时如何正确配置文件夹及文件路径?
问题原因
路径找不到的核心原因有两点:
- 路径定义代码写在了
if __name__ == "__main__":判断块内:用Gunicorn启动时,程序是通过导入main模块加载app对象的,此时__name__变量值为main而非__main__,该判断块内的代码完全不会执行,路径变量根本没有被初始化。 - 原代码用相对路径拼接文件夹位置,路径解析依赖执行启动命令时的工作目录,只要启动位置和直接运行
python main.py时不一致,就会出现路径查找错误。
另外原代码还有两处隐性bug:一是没有导入request对象,POST请求取参数时会报错;二是Flase是拼写错误,正确写法为False。
修复方案
- 第一步:把路径定义逻辑移出
__main__判断块,基于当前main.py文件的绝对位置构建路径,彻底摆脱对启动工作目录的依赖。修正后的main.py代码如下:
import os import pandas as pd from flask import Flask, request # 获取当前main.py文件所在的绝对目录,不随启动位置变化 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 拼接目标文件夹的绝对路径 DATA_PATH = os.path.join(BASE_DIR, 'data') TEST_FOLDER_PATH = os.path.join(DATA_PATH, 'test') app = Flask(__name__) @app.route("/") def index(): return "this working" @app.route("/data", methods=["POST"]) def get_data(): json_data = request.json df = pd.DataFrame(json_data) # 后续处理数据的逻辑直接调用TEST_FOLDER_PATH即可 return "ok" if __name__=="__main__": app.run(debug=False, host="0.0.0.0")
- 第二步:
wsgi.py不需要额外添加路径配置,保持最简结构即可:
from main import app if __name__ == "__main__": app.run()
- 第三步:启动Gunicorn时,切换到
main.py、wsgi.py所在的项目根目录执行启动命令即可,示例命令:gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app
提示:路径初始化逻辑放在模块全局位置即可,启动时只会执行一次,不要放在路由函数内部重复计算,避免不必要的性能损耗。
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

