def create_app(): """ flask app생성 pytest-flask 라이브러리로 테스트 진행시 사용하는 Flask객체를 반환함. """ flask_app = Flask(__name__) # Config flask_app.config.from_object('config.Config') # SQLAlchemy init db.init_app(flask_app) # Bcrypt # bcrypt = Bcrypt(flask_app) try: import importlib with flask_app.app_context(): for blueprint in flask_app.config['BLUEPRINTS']: module = importlib.import_module(blueprint) flask_app.register_blueprint(module.this) except Exception as e: logger.exception(e) raise # APScheduler from flask_apscheduler import APScheduler from app.module.scheduler.listener import stock_scraping, executed from apscheduler.events import EVENT_ALL, EVENT_JOB_EXECUTED scheduler = APScheduler() scheduler.init_app(flask_app) scheduler.add_listener(stock_scraping, EVENT_ALL) scheduler.add_listener(executed, EVENT_JOB_EXECUTED) # scheduler.start() return flask_app
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR from HuntGame import app # goes into __init__ in HuntGame to grab app from flask_apscheduler import APScheduler def test_auto_jobs(): with app.app_context(): for job_id in scheduler.get_jobs(): print(job_id) print(job_id.next_run_time) def my_listener(event): if event.exception: print('The job crashed :(') else: print('The job worked :)') if __name__ == "__main__": scheduler = APScheduler() scheduler.init_app(app) scheduler.start() scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR) test_auto_jobs() app.run(debug=True)
os.system('python bot.py') except Exception as e: log.error('bot crash', exc_info=e) def scheduler_event_listener(event: apscheduler.events.JobExecutionEvent): log.info('scheduler event', evt=event) if event.exception: log.error('The job crashed :(', exc_info=event.exception) else: log.info('The job worked :)') scheduler.add_listener( scheduler_event_listener, apscheduler.events.EVENT_JOB_EXECUTED | apscheduler.events.EVENT_JOB_ERROR) @scheduler.task(trigger='interval', seconds=60) def tick(): print('Tick! The time is: %s' % datetime.datetime.now()) log.info('jobs added', count=len(scheduler.get_jobs())) @app.route('/') def root(): return "OK"
{ 'modelName': model_name, 'status': 'ready' if os.listdir(f'{MODEL_DIR}/{model_name}') else 'training' } for model_name in next(os.walk(MODEL_DIR))[1] if model_name != 'pretrained' ] } def create_model(model_name, iterations): os.mkdir(f'{MODEL_DIR}/{model_name}') scheduler.add_job( id=f'train_{model_name}', func=train_model, args=[model_name, iterations], trigger='date' ) def job_failed(event): match = model_name_regex.match(event.job_id) if match: os.rmdir(f'{MODEL_DIR}/{match.groups()[0]}') scheduler.add_listener(job_failed, EVENT_JOB_ERROR)
class TestScheduler(TestCase): def setUp(self): self.app = Flask(__name__) self.scheduler = APScheduler() self.scheduler_two = APScheduler(app=self.app) def test_running(self): self.assertFalse(self.scheduler.running) self.scheduler.start() self.assertTrue(self.scheduler.running) def test_start_with_allowed_hosts(self): self.app.config['SCHEDULER_ALLOWED_HOSTS'] = ['any_server_name'] self.scheduler.init_app(self.app) self.scheduler.start() self.assertFalse(self.scheduler.running) def test_start_without_allowed_hosts(self): self.app.config['SCHEDULER_ALLOWED_HOSTS'] = [] self.scheduler.init_app(self.app) self.scheduler.start() self.assertFalse(self.scheduler.running) def test_shutdown(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.running) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_load_jobs_from_config(self): self.app.config['JOBS'] = [{ 'id': 'job1', 'func': 'tests.test_api:job1', 'trigger': 'interval', 'seconds': 10, }] self.app.config['SCHEDULER_JOBSTORES'] = { "default": apscheduler.jobstores.memory.MemoryJobStore() } self.app.config['SCHEDULER_EXECUTORS'] = { "default": { "type": "threadpool" } } self.app.config['SCHEDULER_JOB_DEFAULTS'] = {"coalesce": True} self.app.config['SCHEDULER_TIMEZONE'] = utc self.scheduler.init_app(app=self.app) job = self.scheduler.get_job('job1') self.assertIsNotNone(job) def test_task_decorator(self): @self.scheduler.task('interval', seconds=10, id='job1') def decorated_job(): pass job = self.scheduler.get_job('job1') self.assertIsNotNone(job) def test_state_prop(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.state) self.scheduler.shutdown() self.assertFalse(self.scheduler.state) def test_scheduler_prop(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertIsNotNone(self.scheduler.scheduler) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_pause_resume(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.running) self.scheduler.pause() self.assertTrue(self.scheduler.state == 2) self.scheduler.resume() self.assertTrue(self.scheduler.state == 1) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_listener(self): self.scheduler.init_app(self.app) self.scheduler.start() self.assertTrue(self.scheduler.running) self.scheduler.add_listener(None) self.scheduler.remove_listener(None) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_remove_job(self): @self.scheduler.task('interval', seconds=10, id='job1') def decorated_job(): pass self.scheduler.init_app(self.app) self.scheduler.start() job = self.scheduler.get_job('job1') self.assertIsNotNone(job) self.scheduler.remove_job('job1') self.assertFalse(self.scheduler.get_job('job1')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_delete_job(self): @self.scheduler.task('interval', seconds=10, id='job1') def decorated_job(): pass self.scheduler.init_app(self.app) self.scheduler.start() job = self.scheduler.get_job('job1') self.assertIsNotNone(job) self.scheduler.delete_job('job1') self.assertFalse(self.scheduler.get_job('job1')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_remove_all_jobs(self): @self.scheduler.task('interval', hours=1, id='job1') def decorated_job(): pass @self.scheduler.task('interval', hours=1, id='job2') def decorated_job2(): pass self.scheduler.init_app(self.app) self.scheduler.start() jobs = self.scheduler.get_jobs() self.assertTrue(len(jobs) == 2) self.scheduler.remove_all_jobs() self.assertFalse(self.scheduler.get_job('job1')) self.assertFalse(self.scheduler.get_job('job2')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_add_delete_all_jobs(self): @self.scheduler.task('interval', hours=1, id='job1') def decorated_job(): pass @self.scheduler.task('interval', hours=1, id='job2') def decorated_job2(): pass self.scheduler.init_app(self.app) self.scheduler.start() jobs = self.scheduler.get_jobs() self.assertTrue(len(jobs) == 2) self.scheduler.delete_all_jobs() self.assertFalse(self.scheduler.get_job('job1')) self.assertFalse(self.scheduler.get_job('job2')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running) def test_job_to_dict(self): @self.scheduler.task('interval', hours=1, id='job1', end_date=datetime.datetime.now(), weeks=1, days=1, seconds=99) def decorated_job(): pass self.scheduler.init_app(self.app) self.scheduler.start() job = self.scheduler.get_job('job1') self.assertIsNotNone(job) self.assertTrue(len(utils.job_to_dict(job))) self.scheduler.delete_job('job1') self.assertFalse(self.scheduler.get_job('job1')) self.scheduler.shutdown() self.assertFalse(self.scheduler.running)
from templates.display_module import display_module as display_module_blueprint app.register_blueprint(display_module_blueprint, url_prefix='/display_module') from templates.statistic_module import statistic_module as statistic_module app.register_blueprint(statistic_module, url_prefix='/statistic_module') app.config.from_object(Config()) app.config['SECRET_KEY'] = 'MY_KEY' scheduler = APScheduler() scheduler.init_app(app) scheduler._logger = custom_log.get_logger('root') scheduler.add_listener(err_listener, EVENT_JOB_ERROR | EVENT_JOB_MISSED) # @app.route('/job', methods=['GET', 'POST']) # @login_required # def apscheduler_jobs(): # jobs_array = scheduler.get_jobs() # jobs_lists = [] # # for obj in jobs_array: # dic = {'id': obj.id, 'name': obj.name} # func_name = obj.id # if func_name in const.JOB_START_TIME_DICT: # dic['start_time'] = const.JOB_START_TIME_DICT[func_name] # # if func_name in const.JOB_END_TIME_DICT: # dic['end_time'] = const.JOB_END_TIME_DICT[func_name]
from templates.display_module import display_module as display_module_blueprint app.register_blueprint(display_module_blueprint, url_prefix='/display_module') from templates.statistic_module import statistic_module as statistic_module app.register_blueprint(statistic_module, url_prefix='/statistic_module') app.config.from_object(Config()) app.config['SECRET_KEY'] = 'MY_KEY' scheduler = APScheduler() scheduler.init_app(app) scheduler._logger = custom_log.get_logger('root') scheduler.add_listener( err_listener, EVENT_JOB_ERROR | EVENT_JOB_MISSED | EVENT_JOB_MAX_INSTANCES) # @app.route('/job', methods=['GET', 'POST']) # @login_required # def apscheduler_jobs(): # jobs_array = scheduler.get_jobs() # jobs_lists = [] # # for obj in jobs_array: # dic = {'id': obj.id, 'name': obj.name} # func_name = obj.id # if func_name in const.JOB_START_TIME_DICT: # dic['start_time'] = const.JOB_START_TIME_DICT[func_name] # # if func_name in const.JOB_END_TIME_DICT: # dic['end_time'] = const.JOB_END_TIME_DICT[func_name]
Authority_Visitor = 2 pymysql.install_as_MySQLdb() db = SQLAlchemy() scheduler = APScheduler() def event_handle(e): job = scheduler.get_job(e.job_id) bark_root("event_handle error/missed/max") scheduler.add_listener(event_handle, mask=(events.EVENT_JOB_ERROR | events.EVENT_JOB_MISSED | events.EVENT_JOB_MAX_INSTANCES)) class MyLog(db.Model): __tablename__ = 'mylog' id = db.Column(db.Integer, primary_key=True) app_name = db.Column(db.Text, nullable=False) content = db.Column(db.Text, nullable=False) createTime = db.Column(db.DateTime, default=datetime.now) def __repr__(self): return '<log APP:%r>' % self.app_name def my_log(name, content):
# ====== 上面几行是开启 scheduler_api 的,选用 # 定时运行的任务 def now(): print(datetime.datetime.now()) # 任务监控 def listener(event): if event.exception: print('got an exception', event.exception) sched.add_listener(listener, EVENT_JOB_ERROR) sched.init_app(app) sched.add_job('job1', now, trigger='interval', seconds=5) sched.start() @app.route('/') def index(): return 'index' @app.route('/jobs') def show_job(): return get_jobs()
{ "id": "hourly", "func": get_posts, "kwargs": { "url": url }, "trigger": "interval", "hours": 1 }, # trigger to run immediately for initial state { "id": "immediate", "func": get_posts, "kwargs": { "url": url } }, ] SCHEDULER_API_ENABLED = True SCHEDULER_TIMEZONE = "UTC" app.config.from_object(Config()) flask_scheduler = APScheduler() flask_scheduler.init_app(app) flask_scheduler.start() flask_scheduler.add_listener(update_posts_from_event, EVENT_JOB_EXECUTED) app.run(host="0.0.0.0", port=os.getenv("PORT", 5000))