Обновить страницу повторно отправить данные

108
12

У меня есть простой код с Flask. У меня есть веб-сайт с 4 кнопками, которые при нажатии посылают POST в Flask и возвращают ту же страницу, но с кнопкой, которая затягивается другим цветом. Состояния каждой кнопки хранятся в массиве bool.
Это код Flask:

import numpy as np
from flask import Flask, request, render_template

app = Flask(__name__)
states = np.array([0, 0, 0, 0], dtype=bool)

@app.route('/control', methods=['GET', 'POST'])
def control():
if request.method == 'POST':
val = int(request.form['change rele state'])
states[val] = not states[val]

return render_template('zapa.html', states=states)
else:
return render_template('zapa.html', states=states)

if __name__ == '__main__':
app.run(debug=True)

И страница:

{% extends "layout.html" %}

{% block content %}
<h2>Control</h2>
<p>Botones</p>

<p>{{ states }}</p>

<form action="/control" method="POST">
{% for state in states %}
{% if state == True %}
<button class="btn btn-primary" type="submit" name="change rele state" value="{{ loop.index0 }}">Enchufe {{ loop.index }} Off</button>
{% endif %}
{% if state == False %}
<button class="btn btn-danger" type="submit" name="change rele state" value="{{ loop.index0 }}">Enchufe {{ loop.index }} On</button>
{% endif %}
{% endfor %}
</form>

{% endblock %}

Проблема в том, что при нажатии для перезагрузки страницы отправьте, как если бы нажала кнопку. Зачем? Как я могу избежать этого?

спросил(а) 2015-11-29T05:46:00+03:00 4 года, 11 месяцев назад
1
Решение
107

У меня нет невероятно глубокого понимания фляжки, на самом деле ничего нет, но для меня кажется, что вы сделали свой сервер запоминающимся состояние этой кнопки, о которой вы говорите.

return render_template('zapa.html', states=states)

Вместо того, чтобы возвращать измененное исходное состояние, вы возвращаете измененную версию предыдущего состояния в POST с запросом "change role state" и сохраняете исходное значение в противном случае.

Я думаю, что вы хотели сделать (исправьте меня, если я ошибаюсь, следующее)

@app.route('/control', methods=['GET', 'POST'])
def control():
if request.method == 'POST':
val = int(request.form['change rele state'])
current_states = states[:]
current_states[val] = not current_states[val]
return render_template('zapa.html', states=current_states)
else:
return render_template('zapa.html', states=states)

Это создает копию состояний, не изменяя ее в глобальной области видимости, так что следующий контроль времени будет вызываться, список состояний будет в исходном состоянии

Это может быть более элегантно закодировано на моей стороне, но я просто пытаюсь проиллюстрировать эту проблему.

ответил(а) 2015-11-29T06:05:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема