【问题标题】:Update HTML page on submit button with flask and python使用烧瓶和 python 更新提交按钮上的 HTML 页面
【发布时间】:2019-10-07 09:54:06
【问题描述】:

我想要实现的目标: 我正在创建这个小型 Web 应用程序,它将通过 telnet 连接到给定的 ip/s、发送一些命令、获取一些响应并将它们显示在 html 页面中。 我上面提到的一切都将发生在同一页面上。 大多数东西都在工作。

问题: 我试图在按下submit 按钮后在textarea 中提交telnet 命令的同一个HTML 页面中显示从这些ip/s 返回的响应/s。 响应以列表player_responses 的形式发送回html_template。 现在发生的事情是我的循环为响应列表中的每个元素创建了一个新的textarea,这并不酷。 ![当前行为]https://imgur.com/a/4PCNEjs 我只想用所有回复更新已经存在的textarea。 这发生在我的player-poll.html<div id="console">

免责声明: 我是菜鸟,大部分时间都不知道自己在做什么。

为了辩护,我查看了建议的帖子并自己进行了一些研究,但没有找到解决我难题的答案。

app.py

@app.route('/player-poll', methods=['GET', 'POST'])
def player_poll():
    form = PlayerPollForm()
    player_responses = []
    if request.method == 'POST':
        for i in form.ip_addr.data.split():
            player_responses.append(f'Response from {i} is TELNET_ RESPONSE')
            print(f'Item fount {i}')
        print(player_responses)
    return render_template('player-poll.html', title='Player Poll', form=form, len_player_responses=len(player_responses), player_responses=player_responses)

forms.py


class PlayerPollForm(FlaskForm):
    ip_addr = TextAreaField('Players IP address one per line:', validators=[DataRequired()])
    cmd = StringField('Command:', validators=[DataRequired()])
    freq = FloatField('Frequency in sec:', validators=[DataRequired()])
    count = IntegerField('Number of Iterations:', validators=[DataRequired()])
    submit = SubmitField('Send Command')
    logs = TextAreaField('Player Logs:')

玩家投票.html

{% extends "template_layout.html" %}
{% block content %}
    <div class="content-section">
        <form action="{{ url_for('player_poll') }}" method="POST">
            {{ form.hidden_tag() }}
            <fieldset class="form-group">
                <div class="form-group">
                    <legend class="border-bottom mb-4">Player Poll</legend>
                    <div id="row-1" class="row">
                        <div id="col-1" class="col">
                            {{ form.ip_addr.label(class="form-control-label") }}
                        </div>
                    </div>
                    <div id="row-2" class="row">
                        <div id="col-1" class="col">
                            {{ form.ip_addr(class="form-control", rows="10", placeholder="Type your player ip addresses here, one per line.") }}
                        </div>
                        <div id="col-2" class="col">
                            <div id="row-2-6" class="row" style="padding-right: 15px">
                                <div class="col-sm-8 text-left" style="padding-left: 0">
                                    {{ form.submit(class="btn btn-primary btn-lg") }}
                                </div>
                            </div>
                        </div>
                    </div>
                    <div id="console" class="row" style="padding-left: 15px; padding-right: 15px">
                        <legend class="border-bottom mb-2">Player Poll Logs:</legend>
                        <textarea id=playerPollLog class="form-control form-group" rows=17">Responses</textarea>
                        {% if request.method == 'POST' %}
                            {% for i in range(0, len_player_responses) %}
                                <textarea id=playerPollLog class="form-control form-group" rows=17">{{ player_responses[i] }}</textarea>
                            {% endfor %}
                        {% endif %}
                    </div>
                </div>
            </fieldset>
        </form>
    </div>
{% endblock content %}

【问题讨论】:

  • 您使用for-loop 会创建许多textarea- 为什么?如果您只想要一个textarea,那么不要在循环中创建它们,而是将所有文本放入现有的textarea - 在&lt;textarea&gt; 中使用for-loop。或连接view.py 中的所有文本并仅将一个字符串发送到模板并添加到&lt;textarea&gt; 而不使用for-loop。
  • 在我的textarea 中使用for 循环是个好主意,我没想过这样做。正如我所说,我对烧瓶和 html 有点陌生,这不是我的事。谢谢,这有帮助。

标签: python html flask flask-wtforms


【解决方案1】:

我不知道我是否理解 - 但如果你只想要一个文本区域,那么不要在 for-loop 中创建它们,而是在现有 &lt;textarea&gt; 中使用 for-loop

   <textarea id=playerPollLog class="form-control form-group" rows="17">Responses
        {% for response in player_responses %}
            {{ response }}
        {% endfor %}
   </textarea>

最终,您可以连接app.py 中的所有响应并将其作为单个字符串发送到 tempalte - 即。 player_all_responses

   <textarea id=playerPollLog class="form-control form-group" rows="17">Responses
        {{ player_all_responses }}
   </textarea>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多