ОШИБКА Flask-SQLAlchemy: "Приложение не найдено. Либо работайте внутри функции просмотра, либо нажимайте

Я пытаюсь использовать flask-sqlalchemy и следую многочисленным примерам в документации о том, как получить настройку приложения Flask. Однако по какой-то причине я не могу получить контекст приложения. Я в настоящее время использую app.app_context().push() метод. Есть ли другой способ заставить это работать? Что я делаю неправильно? Любая помощь будет оценена.

В настоящее время работает:

Python==3.6.3
Flask==0.12.2
Flask-Compress==1.4.0
Flask-SQLAlchemy==2.3.2

model.py

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import relationship


db = SQLAlchemy()


class Property(db.Model):
    __tablename__ = 'vt_property'

    id = db.Column(db.BigInteger, primary_key=True)
    name = db.Column(db.String(32))
    value = db.Column(db.LargeBinary)
    client_tag = db.Column(db.String(16))

index.py

from flask import Flask, jsonify, request
from flask_compress import Compress

from database.model import *
from manager.some_util import some_user, some_url, some_pass


# App config.
DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)
Compress(app)
app.secret_key = secret_key
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://connection_string'
db.init_app(app)
app.app_context().push()

some_util.py

from database.model import Property
from helpers.util import secret_key


def load_some_config():
    from secure.secure import read_encrypted_text
    some_configs = Property.query.filter(Property.name.contains('MANAGER')).all()
    some_url = ''
    some_user = ''
    some_pass = ''
    for c in some_configs:
        if 'URL' in c.name:
            some_url = c.value.decode('utf-8')
        if 'USER' in c.name:
            some_user = c.value.decode('utf-8')
        if 'PASS' in c.name:
            some_pass = read_encrypted_text(c.value).decode('utf-8')
    return some_url, some_user, some_pass

Когда я пытаюсь запустить мой API, я получаю эту ошибку:

*/venv/bin/python */src/api/index.py
Traceback (most recent call last):
  File "*/venv/lib/python3.6/site-packages/sqlalchemy/util/_collections.py", line 988, in __call__
    return self.registry[key]
KeyError: <greenlet.greenlet object at 0xXXXXXXXX>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "*/src/api/index.py", line 16, in <module>
    from manager.some_util import some_user, some_url, some_pass
  File "*/src/manager/some_util.py", line 23, in <module>
    some_url, some_user, some_pass = load_some_config()
  File "*/src/manager/some_util.py", line 9, in load_some_config
    some_configs = Property.query.filter(Property.name.contains(‘MANAGER’)).all()
  File "*/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 514, in __get__
    return type.query_class(mapper, session=self.sa.session())
  File "*/venv/lib/python3.6/site-packages/sqlalchemy/orm/scoping.py", line 78, in __call__
    return self.registry()
  File "*/venv/lib/python3.6/site-packages/sqlalchemy/util/_collections.py", line 990, in __call__
    return self.registry.setdefault(key, self.createfunc())
  File "*/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2882, in __call__
    return self.class_(**local_kw)
  File "*/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 141, in __init__
    self.app = app = db.get_app()
  File "*/venv/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 912, in get_app
    'No application found. Either work inside a view function or push'
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

0 ответов

Самый простой способ выполнить код в контексте приложения Flask:

with self.app.app_context():

    # ... your code here ...

Обратите внимание, что appэто ваш объект приложения Flask. В вашем случае имя переменной может быть другим.

Другие вопросы по тегам