You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Flask按钮更新SQL数据库完成设备归还功能?

实现设备归还功能:点击按钮更新SQL数据库状态

我正在开发一个展示两个表格的index页面:

  • 用户账户详情(已完成)
  • 用户已借设备

需要在第二个表格中添加归还按钮,点击后更新SQL数据库,将对应设备标记为可用。以下是现有代码:

现有代码

Python(app.py)

@app.route("/", methods=["GET", "POST"])
@login_required
def index():
    # Table 1 (Done)
    rows1 = db.execute("SELECT name AS n FROM users WHERE id = ?", session["user_id"])
    row1 = rows1[0]
    name = (row1["n"])
    rows2 = db.execute("SELECT user_id AS i FROM users WHERE id = ?", session["user_id"])
    row2 = rows2[0]
    user_id = (row2["i"])
    rows3 = db.execute("SELECT phone AS p FROM users WHERE id = ?", session["user_id"])
    row3 = rows3[0]
    phone = (row3["p"])

    # Table 2
    borrowed = db.execute("SELECT equipments.eqp_name, timestamp, purpose, transactions.details, transactions.eqp_serial, return_date FROM transactions JOIN equipments ON equipments.eqp_serial = transactions.eqp_serial WHERE user_id = ? AND availability = 2", session["user_id"])

    if request.method == "POST":
        # TODO
    else:
        return render_template("index.html", name = name, user_id = user_id, phone = phone, borrowed = borrowed)

HTML(index.html)

</table>
<br>
<table>
    <tr style="background-color: #D6DBDF">
        <th>Items borrowed</th>
        <th>Serial</th>
        <th>Borrow Date</th>
        <th>Expected Return Date</th>
        <th>Purpose</th>
        <th>Details</th>
        <th>Return</th>

    </tr>
    <!--equipment borrowed under user for loop-->
    {% for borrow in borrowed %}
    <tr>
        <td>{{ borrow.eqp_name }}</td>
        <td>{{ borrow.eqp_serial }}</td>
        <td>{{ borrow.timestamp }}</td>
        <td>{{ borrow.return_date }}</td>
        <td>{{ borrow.purpose }}</td>
        <td>{{ borrow.details }}</td>
        <form method = "post">
        <td><button name="return">Return</button></td>
        </form>
    </tr>
    {% endfor %}
</table>

解决方案

要实现点击归还按钮更新数据库,需要完成以下两步:

1. 修改HTML表单,传递设备唯一标识

每个归还按钮需要携带对应设备的序列号(eqp_serial),让后端能确定要更新的目标设备。在表单中添加隐藏输入字段:

{% for borrow in borrowed %}
<tr>
    <td>{{ borrow.eqp_name }}</td>
    <td>{{ borrow.eqp_serial }}</td>
    <td>{{ borrow.timestamp }}</td>
    <td>{{ borrow.return_date }}</td>
    <td>{{ borrow.purpose }}</td>
    <td>{{ borrow.details }}</td>
    <form method="post">
        <!-- 添加隐藏字段传递设备序列号 -->
        <input type="hidden" name="eqp_serial" value="{{ borrow.eqp_serial }}">
        <td><button type="submit" name="action" value="return">Return</button></td>
    </form>
</tr>
{% endfor %}

2. 后端处理POST请求,执行数据库更新

在app.py的POST分支中,获取传递的设备序列号,执行SQL更新操作并提交事务:

@app.route("/", methods=["GET", "POST"])
@login_required
def index():
    # 优化:合并用户信息查询,减少数据库请求
    user = db.execute("SELECT name, user_id, phone FROM users WHERE id = ?", session["user_id"])[0]
    name = user["name"]
    user_id = user["user_id"]
    phone = user["phone"]

    borrowed = db.execute("SELECT equipments.eqp_name, timestamp, purpose, transactions.details, transactions.eqp_serial, return_date FROM transactions JOIN equipments ON equipments.eqp_serial = transactions.eqp_serial WHERE user_id = ? AND availability = 2", session["user_id"])

    if request.method == "POST":
        eqp_serial = request.form.get("eqp_serial")
        if eqp_serial:
            # 更新transactions表的设备状态为可用(根据你的数据库定义调整值,比如1代表可用)
            db.execute("UPDATE transactions SET availability = 1 WHERE user_id = ? AND eqp_serial = ?",
                       session["user_id"], eqp_serial)
            # 如果equipments表也需要标记为可用,执行以下语句
            db.execute("UPDATE equipments SET availability = 1 WHERE eqp_serial = ?", eqp_serial)
            # 必须提交事务才能让更新生效
            db.commit()
        # 重定向回index页面,避免表单重复提交
        return redirect("/")
    else:
        return render_template("index.html", name=name, user_id=user_id, phone=phone, borrowed=borrowed)

关键注意事项

  • 状态值定义:确认数据库中availability字段的取值规则(比如2=已借出,1=可用),根据实际情况调整SQL中的数值。
  • 事务提交:必须调用db.commit(),否则数据库更新不会持久化。
  • 防止重复提交:使用redirect("/")代替直接渲染模板,避免用户刷新页面重复触发归还操作。
  • 权限校验:可额外添加逻辑,验证当前用户确实拥有该设备的借用权限,防止恶意请求。

内容的提问来源于stack exchange,提问作者Lewl50

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:30:19