我有一个看起来像这样的烧瓶应用程序:
myapp
-- application.py
-- models.py
-- queries.py
-- routes.py
-- settings.py
application.py看起来像这样:
from flask import Flask
from myapp import routes
def create_app(config_object):
app = Flask(__name__)
app.config.from_object(config_object)
app.register_blueprint(routes.main)
return app
queries.py看起来像这样
from myapp.models import User
class QueryConnection(DATABASE_URI):
self.engine = create_engine(DATABASE_URI)
self.session = sessionmaker(bind=self.engine)
self.Session = self.session()
def get_all_users(self):
return self.Session.query(User).all()
routes.py看起来像这样:
from flask import current_app, Blueprint, render_template
from myapp import queries
main = Blueprint('main', __name__, url_prefix='/')
query_connection = queries.QueryConnection(current_app.config['DATABASE_URI'])
@main.route("/")
def index():
return render_template('index.jinja2', list=query_connection.get_all_users())
models.py看起来像这样:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
我想在routes.py中获取current_app.config [' DATABASE_URI'],以便我可以查询数据库,但我不知道如何将应用程序上下文从application.py传递到queries.py。我尝试在application.py
中使用它with app.app_context():
app.register_blueprint(main)
但是我得到错误"在应用程序上下文之外工作"。其他任何事都会产生同样的错误。
我想将查询封装在自己的类中,以便我可以在测试中的不同上下文中传递数据库uri。
答案 0 :(得分:0)
您需要从您调用create_app方法的位置导入文件。我的猜测是它是application.py。
--- D_file.py
app = create_app(you_config)
--- queries.py
from D_file import app
DB_URI = app.config.['DATABASE_URI']
答案 1 :(得分:-1)
为什么在SQLAlchemy设置中完全涉及Flask应用程序?您有一个可用的配置对象,直接使用它。然后,您可以将会话附加到flask全局对象,或者动态创建会话。
在queries.py
中import get_config from config
config_object = get_config()
engine = create_engine(config_object['DATABASE_URI'])
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
def get_all_users():
session = Session()
users = session.query(User).all()
session.close()
return users
在您的app工厂中:
from flask import Flask, g
from myapp import routes
from myapp.queries import Session
def create_app(config_object):
app = Flask(__name__)
app.config.from_object(config_object)
app.register_blueprint(routes.main)
# automatically set up and close a session for each request
@app.before_request
def before_request(response):
g.session = Session()
@app.after_request
def after_request(response):
g.session.close()
return app