【问题标题】:Pass Variables Between Functions Returning Templates [duplicate]在返回模板的函数之间传递变量
【发布时间】:2019-11-12 15:53:15
【问题描述】:

我使用 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>

【问题讨论】:

    标签: python flask jinja2


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

    • 我不能使用session,因为用户将在会话期间输入和更改值。
    【解决方案2】:

    如果您不是从更永久的东西(例如数据库)中检索列表,您可能需要创建第三个函数,在其中声明/定义您的列表,然后调用该函数..

    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)
    

    我不确定您如何或从何处获取您的列表,但这将避免定义一个全局。

    【讨论】:

    • 抛出了一个 TypeError,提到 test() 缺少 1 个必需的位置参数:'_list' 我完全不知所措,请对此进行扩展。
    • 我已经编辑了原始答案,希望是一个更有用的解决方案。
    • 哇,这么简单又有效。
    • 好吧,看来我说得太快了。我正在从表单的字段中获取我的列表。我会回答我最初的问题,因为我仍然无法达到我的需要。
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2012-09-20
    • 2013-04-09
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多