在将一个 HTML 页面的用户输入渲染到另一个页面的情况下理解 Flask 层次结构(jinja,render_template)

understanding flask hierarchy in case of rendering user input of one HTML page into an other one (jinja, render_template)

我一直在研究问题集:cs50 finance。 “报价”部分的工作方式如下:(1) 用户用股票代码填写 quote.html 的表格 (2) 按提交 (3) 登陆 quoted.html ,我们会在其中显示一些信息,例如公司、股价等

为了简单起见,我决定只使用一个变量“name”并将其值“Anna”硬编码到 application.py 中以检查它是否出现在 quoted.html。

第一种情况:

我在 def quoted 中硬编码了“名称”。在 quote.html 上按“提交”后 quoted.html 出现但它不处理我的变量“name”,我的变量的位置是空白,值“Anna”没有出现。

第二种情况:

我在 def quote 的末尾硬编码了“name”,现在我的变量值“Anna”出现在 quoted.html。

这是为什么?我的想法是,我通过 quote.html 指向 quoted.html ,当程序到达那个点时,它应该在 quoted.html 的定义中找到变量并使用它,但显然它不是所以。那么这里到底发生了什么?

Quote.html

{% extends "layout.html" %}

{% block title %}
    Quote
{% endblock %}

{% block main %}
    <form action="/quote" method="post">
        <div class="form-group">
            <input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="Symbol" type="text">
        </div>
        <button class="btn btn-primary" type="submit">Quote</button>
    </form>
{% endblock %}

Quoted.html

{% extends "layout.html" %}

{% block title %}
    Quoted
{% endblock %}

{% block main %}

    Hello, {{ name }}

{% endblock %}

案例 1 - application.py

的一部分
@app.route("/quote", methods=["GET", "POST"])
@login_required
def quote():
    """Get stock quote."""

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        # Ensure symbol was submitted
        if not request.form.get("symbol"):
            return apology("must provide symbol", 403)

        # Redirect user to quoted to see data
        return render_template("quoted.html")

    else:
        return render_template("quote.html")

@app.route("/quoted")
@login_required
def quoted():

    return render_template("quoted.html", name="Anna")

案例 2 - application.py

的一部分
@app.route("/quote", methods=["GET", "POST"])
@login_required
def quote():
    """Get stock quote."""

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        # Ensure symbol was submitted
        if not request.form.get("symbol"):
            return apology("must provide symbol", 403)

        # Redirect user to quoted to see data
        return render_template("quoted.html", name="Anna")

    else:
        return render_template("quote.html")

@app.route("/quoted")
@login_required
def quoted():

    return render_template("quoted.html")

在情况 1 和 2 中,如果用户从您的网站开始。com/quote 他们将通过 def quote() 并前往 else 语句,因为它是 GET 要求。 Quote.html 将被渲染,这是他们填写字段并点击提交的地方。仍在您的网站上。com/quote 所以这次它会通过 def quote() 作为 POST

如果情况 2 达到

    # Redirect user to quoted to see data
    return render_template("quoted.html", name="Anna")

其中 name="Anna" 参数被传递到 jinja 模板并使用 {{name}} 呈现。

在情况 1 中,它到达代码的相同部分。

    # Redirect user to quoted to see data
    return render_template("quoted.html")

现在没有硬编码名称。但我假设您希望它跳转到 def quoted() 并使用那里的名称呈现 quoted.html?那你需要:

    # Redirect user to quoted to see data
    return redirect(url_for("quoted"))

redirecturl_for 可以从 flask 导入。更多关于 redirects in the flask docs.