【问题标题】:Cannot get HTML to display SQLite3 data with python & flask无法获取 HTML 以使用 python 和烧瓶显示 SQLite3 数据
【发布时间】:2017-02-10 12:47:02
【问题描述】:

我在获取 HTML 页面以使用 Python 和 Flask 显示我的 SQLite3 数据时遇到问题。我在这里发现了一个问题并使用了相同的代码,加上不同的变体,但没有成功。没有错误消息和 HTML 页面加载,但是没有数据存在。这是我用来获取数据的代码;

@app.route("/viewpackages", methods=['GET'])
def viewpackages():
    con = sqlite3.connect('utpg.db')
    db = con.cursor()
    user_id = session.get('id')
    getpackages = db.execute("SELECT pck_id, client_id, date, price,  privatelesson,"
                             "shortgamelesson, playinglesson, notes FROM packages WHERE client_id = ?;", (user_id, ))

    return render_template("view_packages.html", items=getpackages.fetchall())

这是我试图用来显示数据的代码;

<table>
{% for item in items %}
<tr>
    <td>{{column1}}</td>
    <td>{{column2}}</td>
    <td>{{column3}}</td>
    <td>{{column4}}</td>
    <td>{{column5}}</td>
    <td>{{column6}}</td>
    <td>{{column7}}</td>
    <td>{{column8}}</td>
</tr>
{% endfor %}
</table>

我尝试将“列”更改为实际的数据库列名,但问题相同。我尝试调用 SELECT * 而不是每个单独的列,同样的问题。如果我在 python 中运行这段代码;

con = sqlite3.connect('utpg.db')
db = con.cursor()
user_id = session.get('id')
getpackages = db.execute("SELECT pck_id, client_id, date, price,    privatelesson, shortgamelesson, playinglesson, notes FROM   packages WHERE        client_id = ?;", (user_id, ))
packages = getpackages.fetchall()
for row in packages:
     print(row)

它返回所需的结果。所以我认为 HTML 某处存在问题,但我无法弄清楚。

【问题讨论】:

    标签: python html flask sqlite jinja2


    【解决方案1】:

    请尝试以下代码,让我知道它是否适合您:

    <table>
    {% for item in items %}
    <tr>
        <td>{{ item[0] }}</td>
        <td>{{ item[1] }}</td>
        <td>{{ item[2] }}</td>
        <td>{{ item[3] }}</td>
        <td>{{ item[4] }}</td>
        <td>{{ item[5] }}</td>
        <td>{{ item[6] }}</td>
        <td>{{ item[7] }}</td>
    </tr>
    {% endfor %}
    </table>
    

    使用以下代码进行测试:

    app.py

    from flask import Flask, render_template
    import sqlite3
    
    app = Flask(__name__)
    app.secret_key = 'development key'
    
    
    @app.route('/users')
    def get_users():
        con = sqlite3.connect('mydb.db')
        db = con.cursor()
        db.execute('insert into user values ("Aaa", "AAA")')
        db.execute('insert into user values ("Bbb", "BBB")')
        res = db.execute('select * from user')
        return render_template('users.html', users=res.fetchall())
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

    模板/users.html

    <html !DOCTYPE>
    <head>
    <title>SQLite</title>
    </head>
    <body>
    <table>
    {% for user in users %}
    <tr>
        <td>{{ user[0] }}</td>
        <td>{{ user[1] }}</td>
    </tr>
    {% endfor %}
    </table>
    </body>
    </html>
    

    【讨论】:

    • 你需要{{ item[0] }} 或者你必须设置con.row_factory = lite.Row 才能得到{{ item["client_id"] }} 或者{{ item.client_id }}
    • 不幸的是没有.. 仍然只是同一个黑页。我刚刚在浏览器中查看了页面源,可以看到表格已经建好,显然没有任何数据。
    • 我可以像这样在 HTML 表格中创建一个 for 循环吗?枚举中的项目(项目):项目[x]?
    • 尝试for col in item 获取价值而不是index 并使用{{ col }}
    • 这确实显示了数据,但它所做的是从数据库中取出整行并将其显示在表的每一行中。所以我得到了8个列表。我试图通过索引来获取它.. col[0][0], col[0][1] 但这没有用。
    【解决方案2】:

    这是我必须做的.. 对于其他遇到此问题的人,我不知道为什么,但 Jinja 不想让我通过索引访问,所以我这样做了..

    @app.route("/viewpackages", methods=['GET'])
    def viewpackages():
    con = sqlite3.connect('utpg.db')
    con.row_factory = sqlite3.Row
    db = con.cursor()
    user_id = session.get('id')
    getpackages = db.execute("SELECT pck_id, client_id, date, price, privatelesson,"
                             "shortgamelesson, playinglesson, notes FROM packages WHERE client_id = ?;", (user_id, ))
    
    return render_template("view_packages.html", items=getpackages.fetchall())
    

    并将 HTML 更改为..

    <table>
    {% for col in items %}
    <tr>
    <td>{{ col['pck_id'] }}</td>
    <td>{{ col['client_id'] }}</td>
    <td>{{ col['date'] }}</td>
    <td>{{ col['price'] }}</td>
    <td>{{ col['privatelesson'] }}</td>
    <td>{{ col['shortgamelesson'] }}</td>
    <td>{{ col['playinglesson'] }}</td>
    <td>{{ col['notes'] }}</td>
    </tr>
    {% endfor %}
    </table>
    

    现在一切正常,感谢您为我指明正确的方向!

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2021-09-10
      • 2022-11-10
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多