Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问Flask应用程序中的应用程序配置变量_Python_Flask - Fatal编程技术网

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中指定的环境查询哪个数据库。