Flask应用程序错误:在应用程序上下文之外工作

时间:2020-02-21 16:58:55

标签: python flask sqlalchemy apscheduler

我正在尝试在APScheduler的预定作业上插入数据库,但是当我尝试时会得到

RuntimeError: Working outside of application context.

这是我的文件结构

master_content_checklist
                   |app.py
                    flask_mcc
                           |__init__.py
                            mcc.py
                            models.py

内部app.py

import flask_mcc

app = flask_mcc.create_app()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

在我的init.py内

import os
from flask import Flask, render_template
from . import mcc
from . import manage_users
from flask_mcc.models import db, User, Role
from flask_sqlalchemy import SQLAlchemy
from flask_user import UserManager


def create_app(test_config=None):
    configure_database(app)
    user_manager = UserManager(app, db, User)
    db.init_app(app)
    app.register_blueprint(mcc.bp)
    app.register_blueprint(manage_users.bp)
    app.app_context().push()
    return app

def configure_database(app):

    @app.before_first_request
    def initialize_database():
        db.create_all()

    @app.teardown_request
    def shutdown_session(exception=None):
        db.session.remove()

在mcc.py

from flask import Flask, render_template, current_app

from flask_mcc.models import Alert

def send_alert(alert):
    with current_app.app_context():
        new_alert = alert
        new_alert.date_live = datetime.datetime.now()
        new_alert.reoccuring = None
        db.session.add(new_alert)
        db.session.commit()
        print(alert.message)

scheduler = BackgroundScheduler(daemon=True)
scheduler.start()
atexit.register(lambda: scheduler.shutdown(wait=False))

def add_reoccuring_alert(alert):
    scheduler.add_job(send_alert, 'cron', month='2', day='3rd fri', hour=11, minute=24, args=[alert], id=str(alert.id))
    scheduler.print_jobs()

据我了解,我没有在蓝图内正确使用应用程序上下文。我尝试将其导入为

from . import app

然后做

with app.app_context():

但是那也不起作用。我的文件结构不正确吗?我是否应该真正在 init .py中初始化调度程序,但是如何在我的蓝图中对其进行访问? 任何帮助将不胜感激。

0 个答案:

没有答案