Flask - 将列表传递给新视图

Flask - Passing a List to a new View

我正在使用 Flask 和所有相关框架和库(Jinja、WTForms 等...)构建一个 Web 应用程序。这是我第一次使用 Flask 并构建一个合适的 Web 应用程序。我无法弄清楚如何访问应用程序目录文件中不同函数的数据。

明确地说,我想将用户的输入(来自 HTML 表单)传递到生成列表的 python 函数,然后将该列表传递回 HTML 并将其显示在网页上。

例如:

@app.route("/tool2", methods=['GET', 'POST'])
def tool2():
form = ToolForm()

def mainfunc(var1):

    #Code related to souping

    newdata = []

    for i in list(range(2)):

    maindata = [inte.text for inte in soup.find('div', {'id':'main-content'}).find_all('a', {'class': 'main-info'})]

        if var1 == 'x':
            for i2 in maindata:
                rda = i2 
                newdata.append(rda)
        elif var1 == 'y':
            for i3 in maindata:
                rda = "-" + i3 + "-"
                newdata.append(rda)
        elif var1 == 'z':
            for i4 in maindata:
                rda = '+' + i4 + '+'
                newdata.append(rda)
        else:
            redirect(url_for('tool3')) # <-- This is not working either, if someone wants to be generous and enlighten me on that as well.



        print(newdata)

        testpagecount += 1


if form.validate_on_submit():
    mainfunc(form.tester.data)


return render_template('tool2.html', title='Tool-Active', form=form)

我想通过html在网页上打印newdata,但是如果我尝试调用它,什么也没有发生(它不打印,我也没有收到任何错误).

我的 HTML 代码是(无论我尝试在 html 中的什么地方打印 newdata,它都不会打印):

{% extends "layout.html" %}
{% block content %}
<div class="content-section">
    <form method="POST" action="">
        {{ form.hidden_tag() }}
        <fieldset class="form-group">
            <legend>Tester</legend>


            <div class="form-group">
                    {{ form.var1.label(class="form-control-label") }}
                    {% if form.var1.errors %}
                    {{ form.var1(class="form-control form-control-lg is-invalid") }}
                    <div class="invalid-feedback">
                        {% for errors in form.var1.errors %}
                            <span>{{ error }}</span>
                        {% endfor %}
                    </div>
                {% else %}
                    {{ form.var1(class="form-control form-control-lg") }}
                {% endif %}
            </div>


        </fieldset>
        <div class="form-group">
            {{ form.submittool(class="btn btn-outline-info") }}
        </div>
    </form>
</div>
<div class="border-top pt-3">
    <small class="text-muted">
        Learn More <a class="ml-2" href="{{ url_for('about') }}">About</a>
    </small>
</div>
<div class="media-body">

    <div class="article-metadata">
        <a class="mr-2" href="#">{{ newdata }}</a>
        <small class="text-muted">{{ newdata }}</small>
    </div>
<p> {{ newdata }} </p>
</div>
{% endblock content %}

我的问题是,如何将变量从 Python 函数传递给 HTML,并使其显示在网页上?

假设您已成功填充 newlist,然后在 mainfunc 中,您可以 return 以下内容:

return render_template('tool2.html', title='Tool-Active', form=form, mynewlist=newlist)

然后,在您的 tool2.html 视图中,您可以按如下方式遍历此 returned 列表:

<ul>{% for item in mynewlist %}
  <li>item</li>
  {% endfor %}
</ul>

看来 Flask 不喜欢嵌套函数。我通过删除条件下的函数调用并将函数代码放在条件下来实现它,例如:

if form.validate_on_submit():
    newdata = []

    for i in list(range(2)):

        maindata = [inte.text for inte in soup.find('div', {'id':'main-content'}).find_all('a', {'class': 'main-info'})]

        if var1 == 'x':
            for i2 in maindata:
                rda = i2 
                newdata.append(rda)
        elif var1 == 'y':
            for i3 in maindata:
                rda = "-" + i3 + "-"
                newdata.append(rda)
        elif var1 == 'z':
            for i4 in maindata:
                rda = '+' + i4 + '+'
                newdata.append(rda)
        else:
            redirect(url_for('tool3')) # <-- This is not working either, if someone wants to be generous and enlighten me on that as well.



    print(newdata)

    testpagecount += 1