使用Flask时持续遭遇404错误,请求技术排查与解决
Flask 全站404问题的修复方案
核心问题:重复创建Flask实例导致路由未注册
你的routes.py存在重复初始化Flask实例的致命问题:
- 代码先从
blog包导入了__init__.py中创建的正确app实例,但随后连续两次调用Flask(__name__)重新生成新的app,直接覆盖了之前导入的实例。 - 所有
@app.route路由都注册到了这个新的、未被实际运行的app上,而WSGI脚本导入的是__init__.py里的原始app——这个app没有绑定任何路由,因此所有请求都会返回404。
修复步骤
1. 修正routes.py代码
删除重复的Flask初始化代码,直接使用从blog导入的app注册路由:
from flask import render_template, url_for from blog import app, db from blog.models import User, Post # 删除以下两行重复的初始化代码 # app = Flask(__name__, template_folder='templates', static_folder='static') # app = Flask(__name__) @app.route('/') @app.route("/home") def home(): posts = Post.query.all() return render_template('home.html', posts=posts) @app.route("/about") def about(): return render_template('about.html', title='About')
2. 确认导入顺序
__init__.py中最后导入routes的顺序是正确的——必须先完成app和数据库的初始化,再导入路由模块,才能确保路由注册到正确的app实例上。
3. 测试启动逻辑
确保使用正确的启动方式:
- 若用WSGI脚本启动:直接运行你的WSGI文件,此时导入的是
__init__.py中绑定了路由的正确app实例。 - 若本地调试:可在
__init__.py末尾添加启动代码(或保留WSGI脚本的启动逻辑):# 在__init__.py最后添加 if __name__ == '__main__': app.run(debug=True)
额外检查点
- 确认
templates和static文件夹位于项目根目录(与blog包同级),当前__init__.py的默认路径配置是正确的。 - 若修复后仍有问题,可检查数据库连接是否正常:
Post.query.all()若抛出异常,可能导致请求返回500错误,但你的场景是404,核心问题还是路由未注册。
内容的提问来源于stack exchange,提问作者Mike Nti
相关产品推荐
相关产品推荐

