python - Flask,在视图之间传递用户输入的数据
问题描述
跨视图传输变量时出现问题我尝试使用会话并且无法使连接正常工作。假设我有两页, ahome
和page2
。我有一个烧瓶应用程序,它将从用户输入home
并在page2
.
例如,如果你启动我的应用程序,你会看到这个主页:
- 这部分工作正常,我可以输入一个值。
接下来我想要发生的是,在您单击提交后,page2
会生成显示刚刚输入的内容:
- 输入的任何字符串值
home
都应显示在突出显示的部分。
我有以下 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>
解决方案
好的,这里有几个问题。首先,将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 = stringval
session
应用程序.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>
推荐阅读
- python - 跨多个列表的逻辑与运算
- wso2 - 错误:在 WSO2 身份服务器 5.10.0 中添加外部数据库作为主要用户存储时出现“用户管理员不存在”
- android - AsyncTask - 等待其他 Asynctask 的执行
- r - 使用 R 从给定的平均值、中值、SD、最大值和最小值生成数字
- xslt - 在字符串输入中提取分隔数据
- unit-testing - 尝试模拟 gremlin 查询时如何抛出异常?
- javascript - 求前 n num 的总和
- python - 使用 Django 将时间简单地保存为 UTC
- r - Looping through list of columns
- reactjs - TypeError: undefined is not an object (评估 'events[genre][0]')