Обновить HTML-страницу на кнопке отправки с колбой и питоном - PullRequest
0 голосов
/ 07 октября 2019

Чего я добиваюсь: я создаю это небольшое веб-приложение, которое будет подключаться к данным ip / s через telnet, отправлять некоторые команды, возвращать некоторые ответы и отображать их на html-странице. Все, что я упомянул выше, будет происходить на той же странице. Большая часть работы работает.

Проблема: я пытаюсь отобразить ответ / и, полученные от этих ip / s, на той же HTML-странице, с которой я отправляю команду telnet, в textarea после нажатия кнопки submit. Ответы отправляются обратно на html_template в виде списка player_responses. Сейчас происходит то, что мой цикл создает новый textarea для каждого элемента в списке ответов, а не круто. ! [текущее поведение] https://imgur.com/a/4PCNEjs Я просто хочу обновить уже существующий textarea со всеми ответами. Это происходит в <div id="console"> в моем player-poll.html

Отказ от ответственности: я нуб, не знаю, что я делаю большую часть времени.

В свою защиту я посмотрелчерез предложенные посты и сделал некоторые исследования самостоятельно, однако не нашел ответа на мою дилемму.

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:')

player-poll.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 %}

1 Ответ

0 голосов
/ 07 октября 2019

Не знаю, понимаю ли я - но если вам нужна только одна текстовая область, не создавайте их в for -loop, но используйте for -loop внутри существующих <textarea>

   <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>
...