【问题标题】:why isn't my route taking me to where I want to go in Flask with the correct parameter?为什么我的路线没有以正确的参数将我带到我想在 Flask 中去的地方?
【发布时间】:2020-06-30 17:13:01
【问题描述】:

所以在我的路线 displayinfo 上我正在显示信息,所以我提出了请求方法 GET,另外在我的 html 页面上,我有一个要求用户审查的表单,所以我提出了请求方法 post。但是,当我单击按钮提交表单信息时,它需要我到 displayinfo/,但我希望它带我到 displayinfo/(isbn 编号)

这是我的python代码

@app.route("/displayinfo/<book_isbn>", methods=["POST", "GET"])

def displayinfo(book_isbn):
    #global Book_isbn
    #Book_isbn = book_isbn
    if request.method == "POST":

        if not session.get("USERNAME") is None:
            username = session.get("USERNAME")

            review = request.form.get("review")

            user_id = db.execute("SELECT user_id FROM users WHERE username=:username", {"username": username}).fetchone()
            book_id = db.execute("SELECT book_id FROM books WHERE isbn=:isbn)", {"isbn": book_isbn}).fetchone()

            db.execute("INSERT INTO reviews (comment, user_id, book_id) VALUES (:comment, :user_id, :book_id)",{"comment": review, "user_id": user_id, "book_id":book_id})


            db.commit()

        else:
            return render_template("error.html", printthis="Not signed in.")

    else:

        if not session.get("USERNAME") is None:

            booktitle = db.execute("SELECT title FROM BOOKS WHERE isbn = :isbn", {"isbn": book_isbn}).fetchone()
            bookauthor = db.execute("SELECT author FROM BOOKS WHERE isbn = :isbn", {"isbn": book_isbn}).fetchone()
            bookyear = db.execute("SELECT year FROM BOOKS WHERE isbn = :isbn", {"isbn": book_isbn}).fetchone()
            bookisbn = db.execute("SELECT isbn FROM BOOKS WHERE isbn = :isbn", {"isbn": book_isbn}).fetchone()

            #res = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": KqqGbJlg2XMOyLiYRAnhvQ, "isbns": bookisbn})

            return render_template("displayinfo.html", printtitle=booktitle, printauthor=bookauthor,printyear=bookyear, printisbn=bookisbn, book=booktitle)

            db.commit()
        else:
            return render_template("error.html", printthis="Not signed in.")

这是我的html代码

{% extends "template.html" %}
{% block title %}Bookstore{% endblock %}

{% block head %}{{ printtitle }}{% endblock %}

{% block body %}
{{ printtitle }}
{{ printauthor }}
{{ printyear }}
{{ printisbn }}





<p>Write a review: </p>

<form action="{{ url_for('displayinfo',  book_isbn=book.isbn)}}" method="post">

<!--, book_isbn=book.isbn-->

    <li><input type="text" name="review" placeholder="Write a review for {{ book }}"></li>
    <div class="btn">
    <button>Submit</button>
    </div>


</form>




{% block text %}{{ review }}{% endblock %}

{% endblock %}

【问题讨论】:

    标签: python html flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    之后

    db.commit()
    

    粘贴下面的行

    return redirect(url_for('displayinfo', book_isbn=book_isbn))
    

    相关的进口是:

    from flask import redirect, url_for
    

    【讨论】:

    • 这仍然给我一个“在服务器上找不到请求的 URL。如果您手动输入了 URL,请检查您的拼写并重试。”错误。因为当我点击表单上的提交时,它需要我显示/当我希望它带我显示/(一些数字)
    • @aarushi777 请使用包含我建议的最新代码更新您的帖子。
    • @aarushi777 在相关说明中,您传递给渲染模板的参数涉及将booktitle 作为book 传递,并且在您的模板中,您正在调用book_isbn=book.isbn 这似乎不正确。你可能想要&lt;form action="{{ url_for('displayinfo', book_isbn=printisbn)}}" method="post"&gt;
    【解决方案2】:

    从 Flask 传递给模板的 book 变量似乎不是 book 对象,而是一个以书名作为内容的字符串。

    return render_template("displayinfo.html", printtitle=booktitle, printauthor=bookauthor,printyear=bookyear, printisbn=bookisbn, book=booktitle)
    

    也许您可以尝试通过传递 book 对象或将 book.isbn 替换为您传递的 isbn 字符串来修复它 - bookisbn

    另外,我建议在@app.route 中的URL 末尾使用尾随slask。更好,根据 Flask 快速入门 - https://flask.palletsprojects.com/en/1.1.x/quickstart/#unique-urls-redirection-behaviorhttps://flask.palletsprojects.com/en/1.1.x/quickstart/#unique-urls-redirection-behavior

    【讨论】:

    • 谢谢,但是如何在不使用 javascript 的情况下在我的 HTML 代码中传递书籍对象?
    • 使用 Flask 的 render_template 函数返回时,可以将模板变量传递给 HTML 页面。您已经在传递字符串 - 在相同的方法中,您可以传递一个 python 对象并将其作为普通对象访问。由于您目前没有 book 对象,因为您将数据存储在字符串中,我想这不是必需的。它与您实现传递字符串的方式没有任何不同!如果你需要一个例子来看看,只需看看本教程中用户对象是如何传递的——blog.miguelgrinberg.com/post/…
    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 2013-08-19
    • 2017-10-30
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多