Flask中访问变量触发UnboundLocalError的解决方法
问题解决:UnboundLocalError 及文章作者查询错误
错误原因
- 变量未初始化:如果
cevaplanan仅在查询有结果时赋值,无结果时未定义就被使用,会触发UnboundLocalError。 - SQL参数顺序错误:查询语句中
title和content的占位符顺序,与传入参数的顺序不匹配,导致无法正确查询到文章作者。 - 未关闭游标:
cursor2使用后未关闭,可能造成数据库资源泄漏。
修正方案
关键修改点:
- 提前初始化
cevaplanan变量,确保所有执行路径下都有值。 - 修正SQL参数顺序,与占位符对应。
- 正确处理查询结果,取出作者用户名。
- 及时关闭游标,释放资源。
修正后的代码:
@app.route('/yorum/<string:article_title>/', methods=["GET","POST"]) def yorum_ekle(article_title): cevap = CevapVer(request.form) form = ArticleForm(request.form) if request.method=="POST" and cevap.validate(): icerik = cevap.icerik.data cursor2 = mysql.connection.cursor() cnt = form.content.data tit = form.title.data # 修正SQL占位符与参数的对应关系 sorgu2 = "SELECT author FROM articles WHERE title = %s AND content = %s " # 参数顺序与SQL中的占位符顺序一致:title对应tit,content对应cnt cursor2.execute(sorgu2, (tit, cnt)) sonuclar = cursor2.fetchall() # 初始化变量,确保无查询结果时也有默认值 cevaplanan = None # 若查询到结果,提取第一个匹配行的author字段 if sonuclar: cevaplanan = sonuclar[0][0] # 关闭cursor2,释放资源 cursor2.close() cursor = mysql.connection.cursor() sorgu = "insert into yorum(icerik,cevaplayan,cevaplanan) values(%s,%s,%s)" cursor.execute(sorgu,(icerik,session["username"],cevaplanan)) mysql.connection.commit() cursor.close() flash("Yorum eklendi","success") return render_template('cevapla.html', article_title=article_title, cevap=cevap)
补充说明
fetchall()返回的是包含所有查询结果的列表,每个元素是一个行数据元组,因此用sonuclar[0][0]获取第一个结果的第一个字段(即author)。- 若业务要求必须找到文章作者才能提交评论,可以在查询无结果时添加错误提示,比如
flash("Makale bulunamadı","danger")并终止后续操作。
内容的提问来源于stack exchange,提问作者breka yusuf
相关产品推荐
相关产品推荐

