【问题标题】:Flask - Passing a List to a new ViewFlask - 将列表传递给新视图
【发布时间】:2019-06-23 00:16:11
【问题描述】:

我正在使用 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,并将其显示在网页上?

【问题讨论】:

    标签: python html flask web-applications flask-wtforms


    【解决方案1】:

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

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

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

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

    【讨论】:

    • mynewlist 是指我拥有的变量“newdata”吗?我试过了,它似乎不起作用。
    • 请记住,您正在返回变量并呈现tool2.html,因此它应该在.html 文件中可用,因此您应该在返回的html 文件中迭代/循环您的列表;这是一个类似的问题:[stackoverflow.com/questions/38592484/…
    • 我没有收到错误,当我开始输入它时它似乎会自动填充列表作为参数(所以它正在找到它),它似乎没有显示在页面上.我需要摆脱我的其他“render_template”吗?
    • 感谢您的帮助,HTML 现在会自动完成我传递给我的 return_template 参数的变量(所以我会为你投票)。因此,我假设它已成功通过它们,我也知道该列表已通过 print() 成功填充...奇怪的是,尽管它们存在于 HTML 中并根据打印内容完全填充,但它们仍然不会显示在网页上导致我的命令提示符。
    • 您考虑过不在同一个函数中组合 POST 和 GET 吗?制作两个视图,一个将从用户那里获取输入并放入一个列表中,另一个视图将获取该列表并将其显示在另一个 html 中,例如,当用户单击一个按钮时。在更简单的版本中重构视图可能会帮助您更轻松地调试它。希望这会有所帮助。
    【解决方案2】:

    所以看起来 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多