我有一个 Flask 应用程序,它看起来像这样:
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中获取当前应用的config['DATABASE_URI']以便查询数据库,但我不知道如何从application.py传递app上下文到queries.py。我尝试在application.py中使用以下内容:
with app.app_context():
app.register_blueprint(main)
但是我收到了"working outside of application context"的错误。任何其他东西都会给出相同的错误。
我想将查询封装在自己的类中,以便我可以在不同的上下文中传递数据库URI,比如测试中。
flask.current_app
的用途。 - pspencerapp
?没有更好的访问方式吗?current_app
的目的是什么? - TomSawyer