Я работаю над проектом Escape room. По сути, я пытаюсь создать такое поведение:
Веб-браузер отображает часть веб-приложения обычным способом. С этого момента больше не будет ввода от клавиатуры / мыши на клиенте. Я решил использовать временные изменения с помощью JS, чтобы я мог загрузить веб-приложение и через некоторое время перенаправить JS на другой маршрут приложения. Здесь я начинаю бороться, а также перенаправления, основанные на времени. Я хочу, чтобы вход GPIO на стороне сервера заставлял браузер перенаправлять на другой маршрут приложения.
Я использую многопоточность, поэтому при запуске функции маршрута приложенияон запускает поток, выполняющий функцию, которая ожидает ввода GPIO. Функция waitfortrigger
работает и работает как надо, пока я не попытаюсь вернуть перенаправление. В этот момент я получаю неизвестную контекстную ошибку в журнале отладки Flask. Я могу исправить ошибку, используя app.app_context
и app.app_context.push
. В этот момент функция waitfortrigger
запускается без ошибок, но не вызывает перенаправления на стороне клиента. Я также пытался использовать copy_current_context decorator
, но не совсем понял, как его использовать, но безуспешно. Вы можете заметить, что я использую URL для перенаправления, а не функцию url_for
. Это потому, что без запроса на стороне клиента url_for
не может создать URL, на который я пытаюсь перенаправить. Использование полного URL на самом деле не проблема для того, что я пытаюсь сделать.
Я думаю, что я прав, говоря, что причина не работает на стороне клиента, потому что запрос непришло со стороны клиента и находится в потоке, отличном от основного приложения, так что оно не понимает, что перенаправить.
Вот упрощенная версия кода, который я пытаюсь:
from flask import Flask, render_template, redirect, url_for, session, logging
import RPi.GPIO as GPIO
import threading
app = Flask(__name__)
input_pin = 18
def gpio_setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(input_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def waitfortrigger():
while GPIO.input(input_pin) == GPIO.HIGH:
continue
else:
con.push()
return redirect('http://192.168.0.17:5000/page2')
@app.route('/')
def home():
trig_thread.start()
global con
con = app.app_context()
return render_template('home.html')
@app.route('/page2')
def page2():
GPIO.cleanup()
return render_template('page2.html')
if __name__ == '__main__':
gpio_setup()
app.secret_key='test'
trig_thread = threading.Thread(target=waitfortrigger)
app.run(debug=True, host='0.0.0.0')
Что я думаю сейчас: возможно, есть способ, которым я могу использовать функцию waitfortrigger
для обновления чего-либо на стороне сервера, когда он видит вход GPIO и, в свою очередь, отслеживает что-то с помощью JS, а затем перенаправляет в JS на клиентесторона?
Или, может быть, использование Flask для веб-приложения для этого не лучшее решение? Я учусь на ходу, поэтому буду признателен за любые предложения.