python - Flask render_template() 删除数据库中的条目后不显示主页
问题描述
我构建了一个 CRUD 应用程序,它已经工作得很好,但是在删除数据库中的条目后,重定向(即呈现主页模板)到主页不起作用。
def create_venue_submission():
name = request.form["name"]
city = request.form["city"]
try:
venue = Venue(
name=name,
city=city,
)
db.session.add(venue)
db.session.commit()
flash("Venue " + request.form["name"] + " was successfully listed!")
except:
flash(
"An error occurred. Venue " + request.form["name"] + " could not be listed."
)
db.session.rollback()
print(sys.exc_info())
finally:
db.session.close()
return render_template("pages/home.html")
这完美地工作,重定向工作。但是,以下内容没有(请参阅最后一行代码的注释)
@app.route("/venues/<venue_id>", methods=["DELETE"])
def delete_venue(venue_id):
try:
venue_to_delete = Venue.query.get(venue_id)
db.session.delete(venue_to_delete)
db.session.commit()
print("delete that crap")
flash(f"Venue {venue_id } was successfully deleted")
except:
db.session.rollback()
print(sys.exc_info())
flash(f"An error occurred: Venue {venue_id } cound not be deleted")
finally:
db.session.close()
return render_template("pages/home.html") ### This never gets triggered.
我在前端触发这条路线是这样的:
<button
id="delete-venue"
data-id="{{ venue.id }}"
class="btn btn-default btn-sm"
>
Delete
</button>
<script>
const deleteVenueBtn = document.getElementById("delete-venue");
deleteVenueBtn.onclick = function(e) {
const venueId = e.target.dataset["id"];
console.log(`DELETE /venues/${venueId}`);
fetch(`/venues/${venueId}`, {
method: "DELETE"
});
};
</script>
在数据库中,正确的条目被删除,但之后没有任何反应。我不知道,为什么这不起作用。我看不到代码本身的错误。任何人都可以帮助我或解释这种奇怪的行为吗?
解决方案
我认为您应该使用重定向而不是 render_template-
from flask import url_for, redirect
@app.route("/venues/<venue_id>", methods=["DELETE"])
def delete_venue(venue_id):
try:
venue_to_delete = Venue.query.get(venue_id)
db.session.delete(venue_to_delete)
db.session.commit()
print("delete that crap")
flash(f"Venue {venue_id } was successfully deleted")
except:
db.session.rollback()
print(sys.exc_info())
flash(f"An error occurred: Venue {venue_id } cound not be deleted")
finally:
db.session.close()
return redirect(url_for("name of home page function")) ### This never gets triggered.
@app.route("/venues/<venue_id>", methods=["DELETE"])
def delete_venue(venue_id):
try:
venue_to_delete = Venue.query.get(venue_id)
db.session.delete(venue_to_delete)
db.session.commit()
print("delete that crap")
flash(f"Venue {venue_id } was successfully deleted")
except:
db.session.rollback()
print(sys.exc_info())
flash(f"An error occurred: Venue {venue_id } cound not be deleted")
finally:
db.session.close()
return render_template("pages/home.html") ### This never gets triggered.
而在前端——
<script>
const deleteVenueBtn = document.getElementById("delete-venue");
deleteVenueBtn.onclick = function(e) {
const venueId = e.target.dataset["id"];
console.log(`DELETE /venues/${venueId}`);
fetch(`/venues/${venueId}`, {
method: "DELETE",
}).then(response => {
// HTTP 301 response
// HOW CAN I FOLLOW THE HTTP REDIRECT RESPONSE?
if (response.redirected) {
window.location.href = response.url;
}
})
};
</script>
特别感谢Andreas Gelever的 JavaScript 部分。
推荐阅读
- c# - 在 WPF 应用程序中获取 PDF 资源的位置
- javascript - 谷歌应用脚本:如何正确使用逗号分隔的电子表格值转换为数组
- winapi - 使用 SSPI 时如何获取权限?
- grails - Grails 域属性可以为空 - 默认情况下为真?
- google-apps-script - Info on Document has vanished
- javascript - 为什么 react-native 中的默认视图宽度为 100%?为什么使用 alignItems 时没有默认宽度?
- python - 烧瓶中的 SQLalchemy 问题
- intellij-idea - 带有 Bazel 的 Java 项目中的 IntelliJ“找不到要访问的声明”问题
- regex - 删除字符串开头的括号
- python - Pandas DataFrame - 用于字符串/布尔出现计数的滚动列 value_counts()