【问题标题】:Flask render_template() does not show home page after deleting entry in databaseFlask render_template() 删除数据库中的条目后不显示主页
【发布时间】:2020-06-11 16:30:19
【问题描述】:

我构建了一个 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>

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

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

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

    【讨论】:

    • 这很酷——它有效。我真的不明白为什么烧瓶不为我处理这个,我也需要那个 JS 部分。
    猜你喜欢
    • 2017-07-26
    • 2019-08-12
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多