How to run recurring task in the Python Flask framework?
(1)
You can use the app.app_context()
context manager to set the application context. I imagine usage would go something like this:
from apscheduler.scheduler import Schedulerdef checkSecondApi(): with app.app_context(): # Do whatever you were doing to check the second API@app.before_first_requestdef 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)
Alternatively, you could use a decorator
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)
Yes it will still work. The sole (significant) difference is that your application will not be communicating directly with the world; it will be going through a reverse proxy or something via fastcgi/uwsgi/whatever. The only concern is that if you have multiple instances of the app starting, then multiple schedulers will be created. To manage this, I would suggest you move your backend tasks out of the Flask application, and use a tool designed for running tasks regularly (i.e. Celery). The downside to this is that you won't be able to use things like Flask-Mail, but imo, it's not too good to be so closely tied to the Flask ecosystem; what are you gaining by using Flask-Mail over a standard, non Flask, mail library?
Also, breaking up your application makes it much easier to scale up individual components as the capacity is required, compared to having one monolithic web application.