Spec-Zone.ru › Flask 0.12

Крупные приложения

Для крупных приложений рекомендуется использовать пакет вместо модуля. Это довольно просто. Представьте, что небольшое приложение выглядит так:

/yourapplication
    yourapplication.py
    /static
        style.css
    /templates
        layout.html
        index.html
        login.html
        ...

Простые пакеты

Чтобы преобразовать его в более крупное, просто создайте новую папку yourapplication внутри существующей и переместите все в неё. Затем переименуйте yourapplication.py в __init__.py. (Убедитесь, что сначала удалили все файлы .pyc, иначе, скорее всего, всё сломается)

В результате должно получиться что-то вроде этого:

/yourapplication
    /yourapplication
        __init__.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

Но как теперь запустить ваше приложение? Наивный подход python yourapplication/__init__.py не сработает. Скажем так, Python не хочет, чтобы модули в пакетах были стартовым файлом. Но это не большая проблема, просто добавьте новый файл с именем setup.py рядом с внутренней папкой yourapplication со следующим содержимым:

from setuptools import setup

setup(
    name='yourapplication',
    packages=['yourapplication'],
    include_package_data=True,
    install_requires=[
        'flask',
    ],
)

Чтобы запустить приложение, необходимо экспортировать переменную среды, которая указывает Flask, где найти экземпляр приложения:

export FLASK_APP=yourapplication

Если вы находитесь за пределами каталога проекта, обязательно укажите полный путь к каталогу вашего приложения. Аналогично, вы можете включить «режим отладки» с помощью этой переменной среды:

export FLASK_DEBUG=true

Для установки и запуска приложения необходимо выполнить следующие команды:

pip install -e .
flask run

Что мы получили от этого? Теперь мы можем немного реструктурировать приложение на несколько модулей. Единственное, что нужно помнить, это следующий краткий контрольный список:

  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
    setup.py
    /yourapplication
        __init__.py
        views.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

Циклические импорты

Каждый программист на Python ненавидит их, и все же мы только что добавили некоторые: циклические импорты (это когда два модуля зависят друг от друга. В этом случае views.py зависит от __init__.py). Имейте в виду, что это плохая идея в целом, но здесь это на самом деле нормально. Причина этого в том, что мы на самом деле не используем представления в __init__.py и просто гарантируем, что модуль импортирован, и мы делаем это в конце файла.

С этим подходом все еще есть некоторые проблемы, но если вы хотите использовать декораторы, то обойти это никак нельзя. Ознакомьтесь с разделом Becoming Big для вдохновения, как с этим справиться.

Работа с чертежами (Blueprints)

Если у вас есть крупные приложения, рекомендуется разделить их на меньшие группы, где каждая группа реализована с помощью чертежа (blueprint). Для ознакомления с этой темой обратитесь к главе Modular Applications with Blueprints документации.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/patterns/packages/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API