Конвертировать метод GET в метод POST во Flask - PullRequest
0 голосов
/ 13 сентября 2018

Я создаю простое веб-приложение для управления светодиодами в моем Raspberry Pi.

У меня есть вызов маршрута и функции для них, например:

@app.route("/<pin>/<action>")
def action(pin, action):
    if pin == "pin1" and action == "on":
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.LOW)

    if pin == "pin1" and action == "off":
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.HIGH)

Так как по умолчанию Flask считает это методом GET, я использую href с тегом привязки в HTML-файле для передачи булавкии действие.

<button><a href="/pin1/on">ON</a></button>
<button><a href="/pin2/off">Off</a></button>

Это нормально работает для включения и выключения светодиода, но меняет URL после нажатия на кнопку.например, http://0.0.0.0/pin1/on и http://0.0.0.0/pin1/off

Я не хочу, чтобы URL-адрес изменялся, поэтому предлагается метод POST с элементом формы, использующим action и name in button.Итак, я попытался следовать, но это не работает.Коды Python:

@app.route("/pinstatus", methods=['POST'])
def pinstatus():
    if request.form['lighton']:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.LOW)

    if request.form['lightoff']:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.HIGH)

Коды HTML

<form action="{{ url_for('pinstatus') }}" method="POST">    
    <button name="lighton">ON</button>
    <button name="lightoff">Off</button>
</form>

Мне нужна помощь в вышеуказанной ситуации.Есть ли обходной путь?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Надеюсь, еще не поздно.

Вот что вам нужно сделать.Я просто настраиваю ваши Python-коды ниже и использую jQuery для отправки данных методом POST.

1) В вашем файле server.py или app.py создайте функцию, подобную следующей:

@app.route("/<pinstatus>/<int:pin>", methods=['POST'])
def action(pinstatus, pin):
    # Check the value of the parameter: 0 means Off, 1 means On
    if pinstatus == "light" and pin == 0:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.HIGH) 
    elif pinstatus == "light" and pin == 1:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.LOW)
    else:
        return ('Error', 500)
    return ('', 200)

2) Загрузите jQuery в ваши статические шаблоны Flask.Например: <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

3) Используйте следующие JS-коды внутри элемента <head> или некоторый файл сценария, например static/js/script.js, и загрузите его в свой HTML-файл.

<script>
    $(document).ready(function() {
      $('#lighton').click(function() {
        $.post('/light/1');
      });
      $('#lightoff').click(function() {
        $.post('/light/0');
      }); 
    });
</script>       

4) ИспользованиеHTML выглядит следующим образом:

<button id="lighton">On</button>             
<button id="lightoff">Off</button>

Теперь он отправляет данные в методе POST на сервер, и URL-адрес не изменяется на стороне клиента.Дайте мне знать, если это поможет.

0 голосов
/ 13 сентября 2018

Вероятно, самое простое - запустить XHR с внешнего интерфейса, когда пользователь нажимает кнопку.

Например: <button><a onclick='pinAction("/pin1/on");'>ON</a></button>

Тогда в JS сделайте:

<script>
function pinAction(endpoint) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", endpoint, false ); // false for synchronous request
    xmlHttp.send();
    console.log(xmlHttp.responseText); // Maybe send a 200 reply
    return false; // So the default is prevented.
}
</script>

Затем в бэкэнде Flask вы можете продолжать использовать ту же структуру, не используя формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...