You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask中访问变量触发UnboundLocalError的解决方法

问题解决:UnboundLocalError 及文章作者查询错误

错误原因

  1. 变量未初始化:如果cevaplanan仅在查询有结果时赋值,无结果时未定义就被使用,会触发UnboundLocalError。
  2. SQL参数顺序错误:查询语句中title和content的占位符顺序,与传入参数的顺序不匹配,导致无法正确查询到文章作者。
  3. 未关闭游标: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:05:32