Доступ к глобальным переменным Flask в приложениях Blueprint - PullRequest
0 голосов
/ 08 мая 2018

мой исходный код имеет такую ​​структуру:

main.py * * 1004

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = PostgreSQL()
    app.register_blueprint(my_app, url_prefix="/my_app")

my_app.py

from flask import Blueprint, g
my_app = Blueprint("my_app", __name__)
@my_app.route("/")
def index():
    return g.my_db.fetch_all()   <<< ERROR

но это показывает эту ошибку:

AttributeError: '_AppCtxGlobals' object has no attribute 'my_db'

Даже когда я пытаюсь использовать g вне контекста приложения, он показывает эту ошибку:

RuntimeError: Working outside of application context.

Так как установить и получить доступ к глобальным переменным в Flask?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

g не так настойчиво, как вы пытаетесь его использовать. Напишите функцию для создания соединения каждый раз, когда вам это нужно. Предпочтительно использовать расширение базы данных, такое как Flask-SQLAlchemy, для управления соединениями.

db.py:

import <postgresql dependencies>

def get_db():
   db = PostgreSQL()
   # config here
   return db

main.py

from flask import Flask, g

app = Flask(__name__)
app.register_blueprint(my_app, url_prefix="/my_app")

my_app.py:

from flask import Blueprint, g
from db import get_db

my_app = Blueprint("my_app", __name__)

@my_app.route("/")
def index():
    db = get_db()
    data = db.fetch_all()
    db.close()
    return data
0 голосов
/ 08 мая 2018

Это происходит потому, что данные теряются, когда заканчивается контекст (with app.app_context()) (doc) .

Внутри контекста все в порядке:

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = 'database ok'
    print(g.my_db)

# >>> this prints 'database ok'

Но снаружи вы не можете получить доступ к атрибуту:

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = 'database ok'

print(g.my_db)

# >>> this throws RuntimeError: Working outside of application context

, даже если вы создаете новый контекст:

from flask import Flask, g
app = Flask(__name__)
with app.app_context():
    g.my_db = 'database ok'

with app.app_context():
    print(g.my_db)

>>> this throws AttributeError: '_AppCtxGlobals' object has no attribute 'my_db'

Лучше всего объявить объект базы данных перед контекстом., а затем импортировать его.Или, может быть, вы можете создать его прямо внутри my_app.py, где вам это нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...