Проблема в том, что вы звоните add_job
каждый раз, когда запрашивается страница /trend
. Задание должно быть добавлено только один раз, как часть инициализации, перед запуском планировщика (см. Ниже).
Также имеет смысл использовать триггер 'interval'
вместо 'cron'
, поскольку вы хотите, чтобы ваша работа выполнялась каждые 5 секунд. Вот простой рабочий пример:
from flask import Flask
from flask_apscheduler import APScheduler
import datetime
app = Flask(__name__)
#function executed by scheduled job
def my_job(text):
print(text, str(datetime.datetime.now()))
if (__name__ == "__main__"):
scheduler = APScheduler()
scheduler.add_job(func=my_job, args=['job run'], trigger='interval', id='job', seconds=5)
scheduler.start()
app.run(port = 8000)
Пример вывода на консоль:
job run 2019-03-30 12:49:55.339020
job run 2019-03-30 12:50:00.339467
job run 2019-03-30 12:50:05.343154
job run 2019-03-30 12:50:10.343579
Затем вы можете изменить атрибуты задания, вызвав scheduler.modify_job()
.
Что касается второй проблемы, которая заключается в обновлении представления клиента при каждом запуске задания, вы не можете сделать это напрямую из Flask. Уродливым, но простым способом было бы добавить <meta http-equiv="refresh" content="1" >
на HTML-страницу, чтобы дать браузеру команду обновлять ее каждую секунду. Гораздо лучшей реализацией было бы использование SocketIO
для отправки новых данных в режиме реального времени веб-клиенту.