Python 访问Flask应用程序中的应用程序配置变量
我有一个烧瓶应用程序,看起来像这样:Python 访问Flask应用程序中的应用程序配置变量,python,flask,Python,Flask,我有一个烧瓶应用程序,看起来像这样: myapp -- application.py -- models.py -- queries.py -- routes.py -- settings.py from flask import Flask from myapp import routes def create_app(config_object): app = Flask(__name__) app.config.from_object(config_object)
myapp
-- application.py
-- models.py
-- queries.py
-- routes.py
-- settings.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
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())
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)
application.py如下所示:
myapp
-- application.py
-- models.py
-- queries.py
-- routes.py
-- settings.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
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())
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)
querys.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如下所示:
myapp
-- application.py
-- models.py
-- queries.py
-- routes.py
-- settings.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
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())
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)
models.py如下所示:
myapp
-- application.py
-- models.py
-- queries.py
-- routes.py
-- settings.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
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())
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中获取当前的_app.config['DATABASE_URI'],以便查询数据库,但我不知道如何将应用程序上下文从application.py传递到querys.py。我试着在application.py中使用它
with app.app_context():
app.register_blueprint(main)
但我得到的错误是“在应用程序上下文之外工作”。其他任何东西都会产生相同的错误
我想将查询封装在它自己的类中,这样我就可以在不同的上下文中传递数据库uri,就像在测试中一样。您需要导入文件,从中调用create\u app方法。我猜是application.py
--D_file.py
app=创建应用程序(您的应用程序配置)
---querys.py
从D_文件导入应用程序
DB_URI=app.config['DATABASE_URI']
为什么要在SQLAlchemy设置中包含Flask应用程序?如果您有一个可用的配置对象,请直接使用它。然后可以将会话附加到flask全局对象,或动态创建会话
在querys.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
在您的应用程序工厂中:
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
这是一种鸡和蛋的关系。该应用程序包含对查询的调用。我必须让应用程序引用它,但在我创建应用程序时,我已经查询了数据库。所以我需要一种不用调用应用程序就可以访问配置变量的方法。我有一种感觉,这就是烧瓶。当前的应用程序看起来是一个糟糕的设计决定。看一些inspiration@CESCO我已经看过你的回购协议了,那么基本上唯一的方法就是导入软件包,然后传递
应用程序
?没有更好的方法访问它吗?当前应用程序的用途是什么?@TomSawyer I.wise。在您的示例中,似乎配置对象已硬编码到querys.py模块中。如果我想要一个不同的对象来进行测试呢?你可以从某种工厂函数中获取配置。在这个函数中,你会有一些逻辑来决定你所处的环境,并返回一个合适的对象。我不太明白你在说什么。我希望最终返回的适当对象是一个sqlalchemy会话,它知道根据我在app.config中指定的环境查询哪个数据库。