小编典典
(1)
你可以使用app.app_context()上下文管理器来设置应用程序上下文。我想用法会像这样:
from apscheduler.scheduler import Scheduler
def checkSecondApi():
with app.app_context():
# Do whatever you were doing to check the second API
@app.before_first_request
def initialize():
apsched = Scheduler()
apsched.start()
apsched.add_interval_job(checkFirstAPI, seconds=5)
apsched.add_interval_job(checkSecondAPI, seconds=5)
apsched.add_interval_job(checkThirdAPI, seconds=5)
或者,你可以使用装饰器
def with_application_context(app):
def inner(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
with app.app_context():
return func(*args, **kwargs)
return wrapper
return inner
@with_application_context(app)
def checkFirstAPI():
# Check the first API as before
(2)
是的,它仍然可以工作。唯一的(重要的)区别是你的应用程序将不会与世界直接通信。它将通过反向代理或通过fastcgi / uwsgi /任何东西进行。唯一要担心的是,如果你有多个应用程序实例启动,那么将创建多个调度程序。为了解决这个问题,我建议你将后端任务移出Flask应用程序,并使用专门用于定期运行任务的工具(例如Celery)。不利的一面是你将无法使用Flask-Mail之类的东西,但是imo,与Flask生态系统如此紧密地联系并不好。在标准的非Flask邮件库上使用Flask-Mail有什么好处?
而且,与具有一个整体式Web应用程序相比,分解应用程序使按需扩展各个组件变得更加容易。
2020-04-07