首页 > 解决方案 > Flask,在视图之间传递用户输入的数据

问题描述

跨视图传输变量时出现问题我尝试使用会话并且无法使连接正常工作。假设我有两页, ahomepage2。我有一个烧瓶应用程序,它将从用户输入home并在page2.


例如,如果你启动我的应用程序,你会看到这个主页

主页


接下来我想要发生的是,在您单击提交后,page2会生成显示刚刚输入的内容

第2页


我有以下 app.py 文件:

from flask import Flask, render_template, request, session

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():

    stringval = ''
    if request.method == 'POST' and 'stringval' in request.form:
        stringval = request.form.get('stringval')
        session["stringvalue_topass"] = stringval
        return render_template('page2.html', stringval = stringval)

    return render_template("home.html")


@app.route('/page2', methods=['GET', 'POST'])
def page2():
    stringvalue_get = session.get('stringvalue_topass')
    return render_template('page2.html', stringvalue_get = stringvalue_get)




if __name__ == '__main__':
    app.run(debug=True)

以下 home.html:

<!doctype html>

<h1>Enter Value </h1>
<div class="main">
    <form class="pure-form" method="POST" action="/page2">
    stringval:<br>
    <input type="text" name="stringval"><br>
    <button type="submit" class="pure-button pure-button-primary" value="Submit">Submit!</button>
    </form>
</div>

</body>

以及下面的page2.html

<!doctype html>

<h1>You have selected </h1>

<div class="main">
    {% if stringvalue_get %}
        <pre>

    {% print(stringvalue_get) %}
    </pre>
    {% endif %}

</div>

</body>

标签: pythonhtmlformssessionflask

解决方案


好的,这里有几个问题。首先,将action表单的属性home.html设置为"/page2". 这意味着当提交表单时,POST 请求将发送到/page2端点,而不是发送到/home您编写处理表单提交的代码的端点。我们可以通过删除action属性来解决这个问题,因为这意味着表单将发布到加载它的端点——在这种情况下/home

其次,如果不设置密钥来加密会话,则无法使用 Flask 会话。这可以通过为 分配一个值来完成app.secret_key,如下所示:

app = Flask(__name__)
app.secret_key = b"my_secret_key"

最后,您可以直接从模板访问对象,而不是像这样将字符串传递给模板:render_template('page2.html', stringval = stringval),(还要注意这应该是)。因此,总的来说,我们可以将您的应用程序代码更改为:stringval_get = stringvalsession

应用程序.py:

from flask import Flask, render_template, request, session

app = Flask(__name__)
app.secret_key = b"my_secret_key"

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST' and 'stringval' in request.form:
        session["stringvalue_topass"] = request.form.get('stringval')
        return render_template('page2.html')
    return render_template("home.html")


@app.route('/page2', methods=['GET', 'POST'])
def page2():
    return render_template('page2.html')

和您的模板:

主页.html:

<!doctype html>

<h1>Enter Value </h1>
<div class="main">
    <form class="pure-form" method="POST">
    stringval:<br>
    <input type="text" name="stringval"><br>
    <button type="submit" class="pure-button pure-button-primary" value="Submit">Submit!</button>
    </form>
</div>

</body>

page2.html:

<!doctype html>

<h1>You have selected </h1>

<div class="main">
  {% if 'stringvalue_topass' in session %}
  <pre>

    {% print(session["stringvalue_topass"])  %}
  </pre>
  {% endif %}

</div>

</body>

推荐阅读