Flask render_template() 在删除数据库中的条目后不显示主页
Flask render_template() does not show home page after deleting entry in database
我构建了一个 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 部分。
我构建了一个 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 部分。