我使用Flask将URL路由到函数,函数返回模板。 在其中一个功能中,我创建了一个列表,希望在另一个功能中使用。
我试图在全局范围内声明变量,并在修改变量时在函数中将它们声明为全局变量,但是由于我无法具体返回列表,因此更改不会应用于全局范围。我已经读过this answer,但是由于该函数返回的是模板而不是修改后的列表,所以我不知道如何继续。我知道全局变量并不理想,但是我碰壁了。
一些简化的代码:
list1 = []
@app.route('/')
def home():
global list1
list1 = [1,2,3]
return render_template('template1.html', list1=list1)
@app.route('/test')
def test():
list2 = copy(list1)
return render_template('template2.html', list2=list2)
我希望list2为[1,2,3]。 当前为[],引用home()函数之前在全局范围中定义的未更改列表。
---编辑---
为了获得更多的上下文,我将提供一些更新的代码和更多信息。
我正在尝试使test1.html输出[1,2,3]。
我尝试使用g对象,但没有用。
test.py
@app.route('/')
def home():
return render_template('test_form.html')
@app.route('/test_results', methods=['POST', 'GET'])
def form_results():
g.allPlayers = []
for i in range(1,4):
g.allPlayers.append(request.form['player'+str(i)])
return render_template('test_results.html',allPlayers=g.allPlayers)
@app.route('/test1')
def test1():
newList = g.allPlayers
return render_template('test1', newList=newList)
test1.html
<html>
<header>
<title>Test</title>
</script>
</header>
<body>
{{newList}}
<br>
<a href="/second">Second<a>
</body>
</html>
test_form.html
<html>
<header>
<title>Template 1</title>
</script>
</header>
<body>
<form method="POST" action="test_results">
<p></p>
{% for i in range(1,4) %}
<input type="text" name={{"player" ~ i}}><br>
{% endfor %}
    <input type="submit">
</form>
</body>
</html>
答案 0 :(得分:1)
如果您不是要从更永久的内容(例如数据库)中检索列表,则可能要创建第三个函数来声明/定义列表,然后调用该函数。
def my_list():
make_a_list = [1, 2, 3] # make/get list however you want
return make_a_list
@app.route('/')
def home():
list1 = my_list()
print('list 1 = ', list1) # do stuff with list
return render_template('template1.html', list1=list1)
@app.route('/test')
def test():
list2 = my_list()
print('list 2 = ', list2) # do stuff with list
return render_template('template2.html', list2=list2)
我不确定如何或在何处获取列表,但这将避免定义全局变量。
答案 1 :(得分:0)
您可以使用session
。因此,数据将在用户会话期间保存。
from flask import session
@app.route('/')
def home():
session['list1'] = [1,2,3]
return render_template('template1.html', list1=session['list1'])
@app.route('/test')
def test():
if session.get('list1'):
list2 = session['list1']
else:
list2 = []
return render_template('template2.html', list2=list2)