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() 方法

反思

遇到錯誤,先不要急,也不要憑感覺,以爲。。。
要先仔細看下錯誤信息, 這樣避免少走彎路。

不過,走彎路也不是壞事,至少讓自己知道了更多其他的知識。定位問題的能力有所提升。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章