Как работает _init_ файл в проекте Flask при запуске сервера? - PullRequest
0 голосов
/ 13 декабря 2018

Я читаю учебник Flask и узнал, что в большой структуре приложения код перемещается из одного файла app.py в 'функцию фабрики приложений' create_app в файле _init_.py, затемСервер может быть запущен следующим образом:

export FLASK_APP=flaskr
export FLASK_ENV=development
flask run

Интересно, как работает последняя команда за сценой, поскольку в коде нет явного вызова этой фабричной функции, следовательно, приложение не возвращено?

Другой Flask doc пытается объяснить, почему используется такая структура проекта, но в этом случае код в _init_.py явно создает app:

from flask import Flask
app = Flask(__name__)

import yourapplication.views

python doc говорит:

Файлы init .py необходимы для того, чтобы Python рассматривал каталоги как содержащие пакеты;это сделано для предотвращения непреднамеренного скрытия действительными модулями каталогов с общим именем, например, строки, которые встречаются позже (глубже) в пути поиска модулей.В простейшем случае init .py может быть просто пустым файлом, но он также может выполнить код инициализации для пакета или установить переменную all , как описано ниже.

В последнем предложении упоминается «код инициализации», который можно применить во втором случае (и простая структура проекта с файлом app.py), но я не смог применить его к первому случаю.

1 Ответ

0 голосов
/ 13 декабря 2018

В исходном коде фляги они проверяют, существует ли функция с именем create_app.

# Search for app factory functions.
for attr_name in ('create_app', 'make_app'):
    app_factory = getattr(module, attr_name, None)

    if inspect.isfunction(app_factory):
        try:
            app = call_factory(script_info, app_factory)

            if isinstance(app, Flask):
                return 

Это даже говорится в документации :

Flask автоматически обнаружит фабрику (create_app или make_app) в myapp.

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