在返回模板的函数之间传递变量

时间:2019-07-02 03:41:43

标签: python flask jinja2

我使用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 %}
            &emsp;&emsp;&emsp;&emsp;<input type="submit">
        </form>
    </body>
</html>

2 个答案:

答案 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)