我构建了一个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部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句