В больших приложениях лучше использовать пакеты вместо модулей. Это очень просто. Представьте, что небольшое приложение выглядит так:
/yourapplication /yourapplication.py /static /style.css /templates layout.html index.html login.html ...Простые пакеты
Чтобы преобразовать его в чуть большее, просто создайте новый каталог приложения внутри существующего и поместите всё в него. Переименуйте yourapplication.py в __init__.py. (Убедитесь, что удалили все файлы .pyc, иначе скорее всего оно перестанет работать).
У вас должно получиться что-то такое:
/yourapplication /yourapplication /__init__.py /static /style.css /templates layout.html index.html login.html ...Но как теперь запустить приложение? Простой запуск python yourapplication/__init__.py не сработает. Скажем так, Python не хочет запускать модули в пакете, как программы. Но это не проблема, просто добавим во внутренний каталог yourapplication новый файл runserver.py со следующим содержимым:
from yourapplication import app app.run(debug=True)Что это нам даст? Теперь мы можем реструктурировать приложение и поделить его на несколько модулей. Единственное, о чём нужно помнить, это:
- Создание приложения Flask должно происходить в файле __init__.py. Так каждый модуль сможет безопасно импортировать его, а переменная __name__ примет значение имени соответствующего пакета.
- Все функции представлений, к которым применён декоратор route(), должны быть импортированы в файл __init__.py. Не сам объект, но модуль с ними. Импорт модуля представлений производится после создания объекта.
from flask import Flask app = Flask(__name__) import yourapplication.viewsПри этом views.py должен выглядеть так:
from yourapplication import app @app.route('/') def index(): return 'Hello World!'В итоге должно получиться что-то вроде этого:
/yourapplication /runserver.py /yourapplication /__init__.py /views.py /static /style.css /templates layout.html index.html login.html ...Взаимный импорт
Каждый Python-программист его ненавидит, но мы его добавили: два модуля зависят друг от друга. В данном случае views.py зависит от __init__.py. Мы предостерегаем вас от подобного приёма, но здесь он оправдан. Причина заключается в том, что мы на самом деле не используем представления в __init__.py, а просто убеждаемся в том, что модуль импортирован и делаем это в конце файла.
Однако, у этого подхода всё-же есть проблемы, но если вы хотите использовать декораторы, без него не обойтись. Обратитесь к разделу Становимся большими за идеями о том, как с этим справиться.
Работа с Blueprint'ами
Если у вас получаются большие приложения, рекомендуется поделить их на меньшие группы, в которых каждая из групп реализуется при помощи blueprint'ов. За общим введением в тему обратитесь к главе документации Модульные приложения с использованием Blueprint'ов.
Примечания переводчика
Этот и другие переводы можно найти на сайте проекта перевода документации по Flask. Автор проекта - Виталий Кузьмин aka ferm32.
Комментариев нет:
Отправить комментарий