如何在Flask与Jinja中检查Session是否包含指定值?及代码异常解决
Flask Session 匹配失败问题解决
先修复代码语法错误
/add/<string: name>中参数名与冒号间的空格需删除,改为<string:name>,否则Flask无法正确解析路由参数。/list路由装饰器缺少闭合括号,修正为@app.route("/list")。
初始化Session中的列表
首次访问/add时,session["list"]尚未创建,直接调用append会触发KeyError。修改add函数:
@app.route("/add/<string:name>") def add(name): if "list" not in session: session["list"] = [] session["list"].append(name) # 修改session内的可变对象后,必须标记已修改才能让Flask保存变更 session.modified = True return "Successful"
修正数据库查询结果的访问方式
默认cursor.fetchone()返回元组而非对象,data.name会报错,可二选一解决:
- 使用索引访问:例如name是查询结果的第2列,就用
data[1]; - 改用
DictCursor让结果返回字典:
from flask_mysqldb import MySQLdb @app.route("/list") def list(): cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor) query = "Select * From data where id=1" cursor.execute(query) data = cursor.fetchone() return render_template("list.html", data=data)
对应模板也要改为键名访问:
{% if data["name"] in session["list"] %} There is {% else %} None {% endif %}
检查值的类型与大小写一致性
确认数据库取出的data["name"]和session列表中的元素为同一类型(比如都是字符串),且大小写完全匹配——例如数据库存"Alice"、session里是"alice"会导致匹配失败。
打印调试确认实际值
在list函数中添加打印语句,直接查看真实值:
@app.route("/list") def list(): # ... 其他代码 print(session.get("list", [])) print(data.get("name")) return render_template("list.html", data=data)
通过控制台输出可直观排查匹配失败的原因。
内容的提问来源于stack exchange,提问作者Mert Cahit Yiğit
相关产品推荐
相关产品推荐

