首页 > 解决方案 > 有没有更好的方法来获取烧瓶的 app_context?

问题描述

在 Flask 中,我启动另一个线程来运行需要更新 mysql 的耗时任务,我如何在这个线程中使用 Flask_sqlalchemy?

在我的网站中请求 url 时,我尝试运行 bash 脚本。因为 bash 脚本需要很长时间才能运行,所以我不希望它阻塞烧瓶的主线程。所以我启动另一个线程来运行它。当我这样做时,我发现我需要app_context使用烧瓶Flask_sqlalchemy。所以我这样做了:

我的代码的一部分:

@manage_git.route('/makefile', methods=['POST'])
def makefile():
    Threading(target=mkfile, args=(local_git_dir, git_id)).start()
    return redirect(url_for('manage_git.index'))

def mkfile(local_git_dir, git_id):
    from manage import app
    subprocess.Popen(['bash', 'makefile.sh'])
    with app.app_context():
        git_db = GitDb.query.filter_by(id=git_id).first()
        git_db.make = True
        db.session.add(git_db)
        db.session.commit()

我只是想让 app_context 使用 Flask_sqlalchemy,但我导入了一个 Global Variable app。我认为这不是解决这个问题的好方法。

如果你能告诉我: 有没有更好的方法来获取烧瓶的 app_context? 还是有另一种更好的方法来解决我的问题?

- - 补充 - -

分机.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

初始化.py

from flask import FLask

from config import config

from .exts import db, login_manager


def create_app(config_name):
    app = Flask(__name__)
    app_config = config[config_name]
    app.config.from_object(app_config)
    app_config.init_app(app)

    db.init_app(app)

    from .manage_git import manage_git as manage_git_blueprint
    app.register_blueprint(manage_git_blueprint)
    # ......
    return app

管理.py

from app import create_app

from app.models import *

app = create_app('default')

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

标签: pythonflaskflask-sqlalchemy

解决方案


你是如何创建你的应用程序和数据库对象的?根据 Flask-SQLAlchemy 文档,如果您只在 App 对象上使用,您可以将 app 对象传递给您的 SQLAlchemy() 调用:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

现在,当您导入数据库时​​,您无需导入应用程序或使用 app_context:

def mkfile(local_git_dir, git_id):
    subprocess.Popen(['bash', 'makefile.sh'])
    git_db = GitDb.query.filter_by(id=git_id).first()
    git_db.make = True
    db.session.add(git_db)
    db.session.commit()

http://flask-sqlalchemy.pocoo.org/2.3/contexts/http://flask-sqlalchemy.pocoo.org/2.3/quickstart/有关于这个过程和替代方案的更多信息。


推荐阅读