Flask应用部署到Heroku后访问报404错误,本地正常无法加载login.html
问题根因
你遇到的404错误核心是蓝图注册逻辑存在模块导入问题,gunicorn启动时路由未正常加载,另外还有几处隐含的部署适配错误,共同导致了线上异常:
- 同一文件内定义的蓝图不需要跨模块导入:你在app.py中直接定义了
auth蓝图,却写了from app import auth as auth_blueprint来导入,gunicorn以模块形式导入app.py时,这行代码会触发循环导入或导入失败,最终蓝图未成功注册,/、/login路径完全没有对应的路由规则,自然返回404。 - 依赖清单缺失必要包:你的requirements.txt中没有加入用到的
Flask-Login、Flask-User两个依赖,Heroku部署时不会自动安装,会导致应用启动异常。 - 缺少
os模块导入:代码中用到了os.environ读取端口,但是开头没有导入os,线上启动会报错。 - 数据库连接地址写死:你硬编码了
postgresql://myaddress,没有读取Heroku自动注入的DATABASE_URL环境变量,数据库连接会失败。
修复步骤
- 修正蓝图注册逻辑:删除
from app import auth as auth_blueprint这行,直接调用app.register_blueprint(auth)注册当前文件中定义的auth蓝图。 - 补充依赖到requirements.txt,添加两行:
Flask-Login==0.5.0 Flask-User==1.0.2.2
- 在app.py开头添加
import os导入。 - 修改数据库配置为读取环境变量:
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL')
- 检查
templates文件夹下的login.html文件名大小写和路径是否正确,Heroku的Linux文件系统大小写敏感,本地Windows/macOS大小写不敏感不会暴露该问题。
验证方式
修改完成后本地先使用gunicorn启动测试:gunicorn app:app,确认本地访问正常后再重新部署到Heroku即可。
内容的提问来源于stack exchange,提问作者lllakkka
相关产品推荐
相关产品推荐

