Есть ли лучший способ получить app_context фляги? - PullRequest
0 голосов
/ 12 сентября 2018

Во Flask я запускаю другой поток, чтобы запустить трудоемкую задачу, которая требует обновления mysql, как я могу использовать Flask_sqlalchemy в этой теме?

Я пытаюсь запустить скрипт bashкогда запросить URL на моем сайте.Поскольку скрипту 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, но я импортирую глобальную переменную app.Я не думаю, что это хороший способ решить эту проблему.

Мне бы очень помогло, если бы вы могли рассказать мне о: Есть ли лучший способ получить app_context фляги? Или есть другой лучший способ решить мою проблему?

---- дополнительный: ----

exts.py :

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

init .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

manage.py :

from app import create_app

from app.models import *

app = create_app('default')

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

1 Ответ

0 голосов
/ 16 сентября 2018

Как вы создаете свое приложение и объекты БД? Согласно документации 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 / имеют больше информации об этом процессе и альтернативы.

...