Flask Bug记录之JinJa2.exceptions.UndefinedError: 'sqlite3.Row object' has no attribute 'get'
源码
py文件定义db的工厂函数如下
def get_db():
if "db" not in g:
g.db = sqlite3.connect(
current_app.config["DATABASE"],
detect_types=sqlite3.PARSE_DECLTYPES
)
g.db.row_factory = sqlite3.Row
return g.db
<nav>
<h1>Flaskr</h1>
<ul>
{% if g.user %}
<li><span>{{ g.user.get("username") }}</span></li>
<li><a href="{{ url_for('auth.logout') }}">Log Out</a></li>
{% else %}
<li><a href="{{ url_for('auth.register') }}">Register</a></li>
<li><a href="{{ url_for('auth.login') }}">Log In</a></li>
{% endif %}
</ul>
</nav>
Bug
分析
1、第一反应是 sqlite3 不支持 sqlite3.Row 属性
特意查了官方文件,明确示例表示,是支持的。
2、检查代码的正确性, 没有书写错误
3、有回头仔细看了下错误提示信息, 说的是 sqlite3.Row 没有 get 属性
在看到,代码里使用的是 g.user.get("username"),知道原因出在此了。
原因
sqlite3.Row 虽然返回的是dict 类型, 但是他支持的写法是 g.user["username"]
而不是python 中的 dict 中支持的 .get() 方法
反思
遇到错误,先不要急,也不要凭感觉,以为。。。
要先仔细看下错误信息, 这样避免少走弯路。
不过,走弯路也不是坏事,至少让自己知道了更多其他的知识。定位问题的能力有所提升。