воскресенье, 9 июня 2013 г.

Большие приложения во Flask

Перевод статьи: Larger Applications

В больших приложениях лучше использовать пакеты вместо модулей. Это очень просто. Представьте, что небольшое приложение выглядит так:
/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)
Что это нам даст? Теперь мы можем реструктурировать приложение и поделить его на несколько модулей. Единственное, о чём нужно помнить, это:
  1. Создание приложения Flask должно происходить в файле __init__.py. Так каждый модуль сможет безопасно импортировать его, а переменная __name__ примет значение имени соответствующего пакета.
  2. Все функции представлений, к которым применён декоратор route(), должны быть импортированы в файл __init__.py. Не сам объект, но модуль с ними. Импорт модуля представлений производится после создания объекта.
Вот пример __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.

Комментариев нет: