python - 有没有更好的方法来获取烧瓶的 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()
解决方案
你是如何创建你的应用程序和数据库对象的?根据 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/有关于这个过程和替代方案的更多信息。
推荐阅读
- jenkins - 如何跳过 Gitlab 中特定文件更改的 Jenkins CI 触发器?
- node.js - 从 .ejs 文件发送一个 vue 组件 PROPS
- oracle - 使用 from 子句查询时如何更新记录?
- c++ - 通过 const rerefence 传递向量并将元素添加到向量
- r - 如何在 R 中为多面条形图(使用 ggplot 生成)重新排列多列(使用 dplyr)?
- c - 通过 C 中的 MPI_Send 和 MPI_recv 进行结构操作
- python - 类装饰器问题,或者:Python 如何区分方法和静态方法?
- mysql - 使用具有不同半径的位置存储定位器 mySQL 查询
- c++ - 找出结构的内存消耗
- ftp - 当 FileZilla 连接时,PhpStorm 无法连接到 FTP