在Flask app中访问app配置变量

时间:2016-01-17 21:28:13

标签: python 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中获取current_app.config [' DATABASE_URI'],以便我可以查询数据库,但我不知道如何将应用程序上下文从application.py传递到queries.py。我尝试在application.py

中使用它
with app.app_context():
    app.register_blueprint(main)

但是我得到错误"在应用程序上下文之外工作"。其他任何事都会产生同样的错误。

我想将查询封装在自己的类中,以便我可以在测试中的不同上下文中传递数据库uri。

2 个答案:

答案 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