How to use Flask-APScheduler in existed Flask app

user706838 picture user706838 · Sep 6, 2015 · Viewed 8.5k times · Source

I am trying to get familiar with Flask-APScheduler plug-in through the following sample code: https://github.com/viniciuschiele/flask-apscheduler/blob/master/examples/jobs.py#L1

My project has the following structure:

backend
    run.py
    application
        __init__.py
        utilities
            __init__.py
            views
            models

where,

backend>run.py is:

from application import app
app.run(debug=True)
from application import scheduler
scheduler.start()

backend>application>__init__.py is:

from flask import Flask
app = Flask(__name__)
from application.utilities.views import Config
from flask_apscheduler import APScheduler
app.config.from_object(Config())
scheduler = APScheduler()
scheduler.init_app(app)

backend>application>utilities>__init__.py is empty

backend>application>utilities>models.py is empty

backend>application>utilities>views.py is:

class Config(object):
    JOBS = [
        {
            'id': 'job1',
            'func': 'application:utilities:views:job1',
            'args': (1, 2),
            'trigger': {
                'type': 'cron',
                'second': 10
            }
        }
    ]

def job1(a, b):
    print(str(a) + ' ' + str(b))

However, I get the following error:

(env)$ python run.py local
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from application import app
  File "HOME/backend/application/__init__.py", line 106, in <module>
    scheduler.init_app(app)
  File "/home/xxxxxx/.anaconda/envs/env/lib/python2.7/site-packages/flask_apscheduler/scheduler.py", line 73, in init_app
    self.__load_jobs(app)
  File "/home/xxxxxx/.anaconda/envs/env/lib/python2.7/site-packages/flask_apscheduler/scheduler.py", line 136, in __load_jobs
    self.__load_job(job, app)
  File "/home/xxxxxx/.anaconda/envs/env/lib/python2.7/site-packages/flask_apscheduler/scheduler.py", line 159, in __load_job
    func = ref_to_obj(func)
  File "/home/xxxxxx/.anaconda/envs/env/lib/python2.7/site-packages/apscheduler/util.py", line 264, in ref_to_obj
    raise LookupError('Error resolving reference %s: error looking up object' % ref)
LookupError: Error resolving reference application:utilities:views:job1: error looking up object

Does my structure look like ok? Have a placed the right code in the right place? What should I change to make it work?

Answer

Alex Gr&#246;nholm picture Alex Grönholm · Sep 6, 2015

Your reference should only have one colon (":"). The colon separates the required import from the variable that has to be looked up. So:

'func': 'application.utilities.views:job1'