在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,但是我导入了全局变量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()
答案 0 :(得分:0)
您如何创建应用程序和数据库对象?根据Flask-SQLAlchemy文档,如果仅在App对象上使用,则可以将app对象传递给SQLAlchemy()调用:
car_model |wheel_brand|wheel_size
"Honda CRV"|"GoodDay" |17
现在,当您导入数据库时,您将无需导入应用程序或使用app_context:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
http://flask-sqlalchemy.pocoo.org/2.3/contexts/和http://flask-sqlalchemy.pocoo.org/2.3/quickstart/了解有关此过程和替代方法的更多信息。