Use application configuration variables in a Flask application

I have a flash application that looks like this:

myapp
-- application.py
-- models.py
-- queries.py
-- routes.py
-- settings.py

application.py looks like this:

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 looks like this:

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 looks like this:

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 looks like this:

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)

I want to get current_app.config ['DATABASE_URI'] in routes.py so that I can query the database, but I don’t know how to pass the application context from application.py to queries.py. I tried using this in application.py

with app.app_context():
    app.register_blueprint(main)

But I get the error "work out of application context". Everything else gives the same error.

I want to encapsulate queries in my own class so that I can pass database uri in different contexts, for example, in tests.

+7
source share
2

, 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

Flask SQLAlchemy? , , . .

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

factory:

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
-2

Source: https://habr.com/ru/post/1624697/


All Articles