Flask应用删除数据后HTML表格不即时更新,需重启终端问题排查
问题描述
开发了一款Flask应用,实现了数据库数据的增删操作,数据展示在HTML表格中。增删功能本身能正常运行,但执行操作后,浏览器里的HTML表格没法即时更新,必须在VSCode里按CTRL+S重启终端后表格才会更新。已经试过清除浏览器缓存、更换localhost,问题还是没解决,需要排查延迟更新的原因。
附上删除功能的代码:
@app.route("/skill_delete/<int:id>") def skill_delete(id): skill_to_delete = Skill.query.get_or_404(id) try: db.session.delete(skill_to_delete) db.session.commit() flash("Skill deleted successfully") return redirect(url_for('admin_view')) except: flash("FAILED") return redirect(url_for('admin_view'))
可能的原因及解决办法
- 关闭Flask模板缓存:Flask调试模式默认开启模板缓存,导致页面不会重新渲染最新数据。两种解决方式:
- 初始化App时添加配置:
app.config['TEMPLATES_AUTO_RELOAD'] = True - 渲染模板时指定缓存超时:
render_template('admin_view.html', skills=skills, cache_timeout=0)
- 初始化App时添加配置:
- 检查admin_view的数据查询逻辑:确保
admin_view每次请求都重新从数据库拉取数据,别把查询结果存在全局变量或者复用旧的查询对象。比如要把skills = Skill.query.all()写在admin_view函数内部,而不是函数外面。 - 改用POST请求执行删除:GET请求容易被浏览器缓存,把删除路由改成POST方式:
前端用表单或者AJAX发送POST请求,避免浏览器缓存旧的GET请求结果。@app.route("/skill_delete/<int:id>", methods=['POST']) - 确保数据库会话同步:在
admin_view查询数据前,执行db.session.refresh()同步会话状态,或者直接重新执行查询语句,不要复用之前的查询结果。 - 添加响应头禁用HTTP缓存:在
admin_view返回页面时设置缓存控制头,强制浏览器不缓存页面:def admin_view(): skills = Skill.query.all() resp = render_template('admin_view.html', skills=skills) resp.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' resp.headers['Pragma'] = 'no-cache' resp.headers['Expires'] = '0' return resp
内容的提问来源于stack exchange,提问作者GrigasK
相关产品推荐
相关产品推荐

