Как исправить «всплывающий неверный контекст приложения» во Flask с помощью APScheduler - PullRequest
0 голосов
/ 11 июля 2019

Я добавляю фоновые задачи с APScheduler во время выполнения в зависимости от вызова API. Другими словами, при запуске приложения нет фоновых задач. Когда пользователь выполняет вызов API, задачи добавляются во время выполнения. Но я получаю сообщение об ошибке:

AssertionError: выскочил неверный контекст приложения

Приложение работает отлично, если я закомментирую строки, в которых запланированы фоновые задачи. Моя структура приложения выглядит следующим образом:

/project
  manage.py
  requirements.txt
  /app
    /models
    /routes
    /utils
    /api
    config.py
    __init__.py

Мой manage.py файл выглядит так:

app = create_app('dev')
app.app_context().push()
manager = Manager(app)
migrate = Migrate(app, db, render_as_batch=True)
manager.add_command('db', MigrateCommand)

with app.app_context():
    scheduler = BackgroundScheduler()
    scheduler.start()


@manager.command
def run():
    app.run()
    atexit.register(lambda: scheduler.shutdown())


if __name__ == '__main__':
    manager.run()

init .py внутри папки приложения:

from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

from email_scheduler.routes.routes import set_routes
from .config import config_by_name
# from app.models.task import TaskModel

db = SQLAlchemy()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config_by_name[config_name])
    api = Api(app)
    set_routes(api)
    from email_scheduler.models.api_models import TaskModel, User
    db.init_app(app)
    with app.app_context():
        db.create_all()

    return app

Мой файл api.py:

class SignUp(Resource):
    def clean_scheduling_time(self, schedule_time):
        day = schedule_time.split(' ')[0].lower()[:3]
        hour, mins = schedule_time.split(' ')[1].split(':')
        return day, hour, mins

    def post(self):
        args = user_parser.parse_args()
        username, password = args.get('username'), args.get('password')
        schedule_time, email_to = args.get('schedule_time'), args.get('email_to')

        if username is None or password is None:
            abort(400)  # missing arguments
        from email_scheduler.models.api_models import User
        if User.query.filter_by(username=username).first() is not None:
            abort(400)  # existing user

        user = User(username=username, schedule_time=schedule_time.split(' ')[1], email_to=email_to)
        user.hash_password(password)
        user.save_to_db()

        from manage import scheduler
        from email_scheduler.utils.utils import send_email
        day, hour, mins = self.clean_scheduling_time(args.get('schedule_time'))
        trigger = CronTrigger(day_of_week=day, hour=int(hour), minute=int(mins))
        scheduler.add_job(send_email, trigger=trigger)
        print(scheduler.get_jobs())

        return make_response(jsonify({'username': username}), 200)

Что странно, так это то, что, хотя я получаю эту ошибку на терминале, задача каким-то образом назначается и запускается. И если я возьму код из API, который планирует задачи, API работает просто отлично. Что я делаю не так?

...