Возможно и иногда удобно запускать Flask в потоке вне приложения переднего плана.Есть хитрость, большая ловушка и ограничение.
Ограничение заключается в том, что это то, что вы хотите делать в «безопасной» среде (например, на своем ноутбуке для сервера локального браузера илив вашей домашней интрасети), так как он включает в себя запуск сервера разработки, что вы не хотите делать в агрессивной среде.Вы также не можете использовать автоматическую перезагрузку страницы (но вы можете включить отладку).
Подводный камень в том, что, если пользовательский интерфейс разделяет любое нетривиальное состояние (включая dicts) с приложением переднего плана, вам понадобитсяиспользовать общий threading.Lock()
для защиты доступа таким образом, чтобы только один поток одновременно считывал или записывал данные.
Хитрость заключается в том, чтобы вставить ссылку на общее состояние в конфигурацию приложения после его создания, но довы запускаете его, делая что-то вроде:
def webserver(state):
app.config['STATE'] = state
# If running on, say, a Raspberry Pi, use 0.0.0.0 so that
# you can connect to the web server from your intranet.
app.run(host='0.0.0.0', use_reloader=False, debug=True)
def main():
state = SharedState()
web_thread = threading.Thread(target=webserver, args=(state,))
web_thread.start()
state.set('counter' 0)
while True:
# Do whatever you want in the foreground thread
state.set('counter', state.get('counter') + 1)
class SharedState():
def __init__(self):
self.lock = threading.Lock()
self.state = dict()
def get(self, key):
with self.lock:
return self.state.get(key)
def set(self, key, value):
with self.lock:
self.state[key] = value
Затем из функций представления Flask выполните что-то вроде
@app.route('/')
def home():
state = app.config['STATE']
counter = state.get(counter)
return render_template("index.html", counter=counter)