【问题标题】:Index out of range using Flask/Python使用 Flask/Python 索引超出范围
【发布时间】:2017-02-10 20:10:19
【问题描述】:

我正在开发一个 Web 应用程序并遇到以下代码的一些问题。我有一个需要更新值的数据库。当我尝试更新值时,我得到一个索引超出范围错误,但是当我只使用 python 运行代码而不使用 web 部件时,它运行并按预期执行。我无法弄清楚当我尝试它时发生了什么变化部分包含烧瓶和 HTML 表单。这是我更新数据库的代码;

编辑:: 经过更多测试后,将我需要的数据推送回 /poplesson 的表单似乎存在一些问题。如果更改这些行;

user_id = request.form['clientid']
pck_id = request.form['packageid']

user_id = 1
pck_id = 1

它将按计划工作,但这不是我需要的,因为我需要从数据库中提取这些 ID。

@app.route("/poplesson", methods=['GET', 'POST'])
def poplesson():
if request.method == 'GET':
    return render_template('view_packages.html')
elif request.method == 'POST':
    con = sqlite3.connect('utpg.db')
    db = con.cursor()
    user_id = request.form['clientid']
    pck_id = request.form['packageid']
    package = db.execute("SELECT * FROM packages WHERE client_id = ?;", (user_id, ))
    result = package.fetchall()
    privatelessons = result[0][4] ##Without flask this run, with flask this  throws an index error.
    pop = privatelessons - 1
    db.execute("UPDATE packages SET privatelesson = ? WHERE client_id = ? AND pck_id = ?;", (pop, user_id, pck_id, ))
    con.commit()
    return render_template('view_packages.html')

这是我用来显示 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>
<td><form class="form-container" action="/deletepackage" method="POST">
<input class="form-field"  value="{{ col['pck_id'] }}" name="packageid" />  <br />
    <input class="submit-button" type="submit" value="DELETE Package" />  </form>
 </td>
 <td><form class="form-container" action="/poplesson" method="POST">
 <input class="form-field"  value="{{ col['client_id'] }}" name="clientid" />  <br />
    <input class="form-field"  value="{{ col['pck_id'] }}" name="packageid" />
    <input class="submit-button" type="submit" value="Subtract Private Lesson" /></form></td>
</tr>
{% endfor %}
</table>
</body>

如果我只在 python 中执行此部分,它会按预期运行,并且使用查看的数据库我可以看到数据库已更新。有什么想法吗?

    con = sqlite3.connect('utpg.db')
    db = con.cursor()
    user_id = request.form['clientid']
    pck_id = request.form['packageid']
    package = db.execute("SELECT * FROM packages WHERE client_id = ?;", (user_id, ))
    result = package.fetchall()
    privatelessons = result[0][4] ##Without flask this run, with flask this  throws an index error.
    pop = privatelessons - 1
    db.execute("UPDATE packages SET privatelesson = ? WHERE client_id = ? AND pck_id = ?;", (pop, user_id, pck_id, ))
    con.commit()

【问题讨论】:

  • 检查你是否使用了同一个数据库,有没有 Flask
  • clientid 和 packageid 的发布值是多少?它是否在烧瓶外工作,因为您将它们设置为 1 而不是“1”?
  • 它与我在本地运行的数据库相同,只是测试所有内容。我刚刚添加了.. int_user = int(user_id), int_pck = int(pck_id) 这似乎使它起作用了。但这没有多大意义,它上面的另一个表单不需要我在表单输入上调用 int ,并且功能几乎不一样..有什么想法吗?此外,我在 /poplesson 末尾的 return 语句由于某种原因没有呈现模板。

标签: python flask sqlite jinja2


【解决方案1】:

我可以想到两个可能的原因:

  1. 使用/不使用 Flask 的数据库配置不同
  2. 在这两个代码中检查typeuser_id 的值。可能会有所不同。

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 2017-10-02
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多