首页 > 解决方案 > 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>

在数据库中,正确的条目被删除,但之后没有任何反应。我不知道,为什么这不起作用。我看不到代码本身的错误。任何人都可以帮助我或解释这种奇怪的行为吗?

标签: pythonflaskflask-sqlalchemyflask-wtforms

解决方案


我认为您应该使用重定向而不是 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 部分。


推荐阅读