Spec-Zone.ru › Flask 2.2

Приложения больших размеров как пакеты

Представьте структуру приложения Flask, которая выглядит так:

/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',
    ],
)

Установите ваше приложение, чтобы его можно было импортировать:

$ pip install -e .

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

$ flask –app yourapplication 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 и просто гарантируем, что модуль импортирован, и делаем это в конце файла.

Работа с Blueprint

Для больших приложений рекомендуется разделить их на меньшие группы, где каждая группа реализуется с помощью Blueprint. Для более подробного ознакомления с этой темой обратитесь к главе Модульные приложения с Blueprints документации.

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

Spec-Zone.ru

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