Pull to refresh

Comments 8

Спасибо за ваши труды.
Недавно понадобилось сделать небольшой сайт, и эта серия переводов очень помогла.
С меня плюсик.
Итак, как же db узнает, что должен использовать экземпляр self.app, который я только что создал?

Не смог этого понять. Зачем db узнавать, если он и так уже знает о приложении?


В app/test.py сейчас создается приложение, в методе setUp:


...
from app import create_app, db
...

class UserModelCase(unittest.TestCase):
        def setUp(self):
                self.app = create_app(TestConfig)
                ...

А вот код в app/__init__.py которое создает приложение и передает его в экземпляр db:


def create_app(config=Config, name=__name__):
    ...
    app = Flask(name)
    app.config.from_object(config)

    db.init_app(app)
    ...

Получается, это какие-то разные экземпляры db? И как они получаются разными?


  • Первый это при импорте в app/test.py?
  • Второй при создании приложения в app/test.py и вызове метода create_app?

Если команда импорт, импортирует экземпляр db из app/__init__.py, который еще не знает о существовании экземпляра приложения, но позже происходит создание приложения методом create_app(TestConfig) в котором экземпляр db инициализируется только что созданным экземпляром приложения. Зачем еще нужны контексты? Вообще не понимаю, что происходит и как это понять.

Дополнение к вопросу: А как тогда приложение связывается с экземпляром db например в app/modeles.py где есть только импорт?


from app import db
...
class User(UserMixin, db.Model):
...

Также, не могу разобраться с импортами. Что-то очень сложное для меня, никак не логичное. Просьба помочь. Пример:


В приложении есть Blueprint main, в файле app/main/__init__.py происходит его инициализация:


from flask import Blueprint

bp = Blueprint('main', __name__)

from app.main import routes

Что означает последняя строчка? Импортировать все объекты? Т.е. Они (или код) фактически "вставятся" в этот файл (app/main/__init__.py)? Если так, то зачем в app/main/routes.py есть свой "from app import bp", если переменная bp уже есть в этом (app/main/__init__.py) модуле? Попробовал закомментировать импорт в app/main/routes.py, получаю ошибку.
Просто не понятна логика импортирования. Где можно вразумится, как это в Пайтоне работает?

Мне не понятна вот эта схема:


app/__init__.py


    # ...
    from app.errors import bp as errors_bp
    app.register_blueprint(errors_bp)
    # ...

app/errors/__init__.py


    # ...
    bp = Blueprint('errors', __name__)

    from app.errors import handlers

Что выполняет или делает вот эта строчка — from app.errors import handlers? Что происходит, когда выполняется from app.errors import bp as errors_bp в файле app/__init__.py?

Вопрос снимаю )) Я просто загнался и надо было немного отдохнуть ))
Переменная bp остаётся в пространстве модуля, т.е. в routes.bp, а из этого модуля пространство __init__.py не доступно.
Это и так было мне понятно, но пока рефакторил код по статье, запутался что и куда импортируется и возник этот вопрос ))

Я смог изменить все ссылки на app.config с current_app.config без каких-либо трудностей с помощью простого поиска и замены.

orig.
I was able to change all references to app.config with current_app.config without any difficulty through simple search and replace.

With не всегда переводится как «c». Я бы поправил на:
Я смог изменить все упоминаня app.config на current_app.config...
Sign up to leave a comment.

Articles