Flask应用经PyInstaller打包为exe后访问出现404 Not Found错误
Flask打包exe后404问题的排查与解决
1. 静态/模板路径不匹配(最常见原因)
PyInstaller打包后,Flask默认的templates和static目录路径会失效——因为exe运行时会解压到临时目录,而非脚本所在的原目录。
解决步骤:
- 修改Flask实例初始化代码,适配打包后的路径:
import sys import os from flask import Flask def create_app(): # 判断是否为打包后的运行环境 is_frozen = getattr(sys, 'frozen', False) app_root = sys._MEIPASS if is_frozen else os.path.dirname(os.path.abspath(__file__)) app = Flask( __name__, template_folder=os.path.join(app_root, 'templates'), static_folder=os.path.join(app_root, 'static') ) # 注册你的路由,示例: @app.route('/') def index(): return "Hello World" return app if __name__ == '__main__': app = create_app() app.run(host='0.0.0.0', port=5000)
- 更新
my_script.spec文件,确保资源目录被打包进去:
在Analysis的datas参数中添加静态/模板目录映射:
a = Analysis( ['my_script.py'], datas=[ ('templates', 'templates'), # 原路径:打包后路径 ('static', 'static') ], # 其他原有配置... )
之后重新执行pyinstaller my_script.spec打包。
2. 路由未正确加载
如果使用了蓝图、动态导入或者模块化路由,PyInstaller可能没有自动包含这些模块,导致路由未注册。
解决方法:
- 确保所有路由模块都被显式导入(避免隐式导入),比如在主脚本中导入蓝图:
from my_blueprint import bp app.register_blueprint(bp)
- 检查
spec文件的hiddenimports参数,把未被自动检测到的模块加进去:
a = Analysis( ['my_script.py'], hiddenimports=['my_blueprint', 'other_route_module'], # 其他配置... )
3. 运行时工作目录错误
exe运行时的当前工作目录可能不是exe所在目录,导致Flask无法读取配置或资源。
解决方法:
在代码开头添加工作目录切换逻辑:
if getattr(sys, 'frozen', False): # 切换到exe所在目录 exe_dir = os.path.dirname(os.path.abspath(sys.executable)) os.chdir(exe_dir)
4. 验证方法
- 打包后运行exe时,在代码中打印关键路径(比如模板目录、当前工作目录),确认是否正确:
print(f"Template folder: {app.template_folder}") print(f"Current working dir: {os.getcwd()}")
- 检查Flask的路由列表,确认所有路由都已注册:
print("Registered routes:") for rule in app.url_map.iter_rules(): print(f"{rule.methods} -> {rule.rule}")
内容的提问来源于stack exchange,提问作者Litchy
相关产品推荐
相关产品推荐

