Flask Todo应用报错求助:NameError与UnboundLocalError问题
问题分析与解决
错误根源
你的代码里hello_world函数存在变量作用域问题:
- 仅当请求为
POST方法时,才会在if块内定义allTodos变量; - 当请求为
GET方法时,不会执行if块内的代码,直接执行return render_template(...),此时allTodos未被定义,触发UnboundLocalError; - 若强行加
global allTodos,因为全局环境中根本没有声明过allTodos变量,所以会触发NameError。
修复代码
在函数开头就初始化allTodos,确保无论GET/POST请求都能正确获取该变量:
@app.route('/' , methods=['GET','POST']) def hello_world(): # 先初始化变量,覆盖所有请求场景 allTodos = Todo.query.all() if request.method == 'POST': title = request.form['title'] desc = request.form['desc'] todo = Todo(title = title, desc = desc) db.session.add(todo) db.session.commit() # 提交后重新查询,更新数据 allTodos = Todo.query.all() return render_template('index.html',allTodo=allTodos)
额外提示
- 模型类里的字段名
data_created建议改为date_created,拼写更准确; - 首次运行前,需要在Python交互环境中执行
db.create_all()来创建数据库表,否则会出现表不存在的错误。
内容的提问来源于stack exchange,提问作者Muaz Ashraf
相关产品推荐
相关产品推荐

