如何实现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
相关产品推荐
相关产品推荐

