Spec-Zone.ru › Flask 2.0

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

Представьте себе простую структуру приложения 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',
    ],
)

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

$ export FLASK_APP=yourapplication
> set FLASK_APP=yourapplication
> $env:FLASK_APP = "yourapplication"

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

$ export FLASK_ENV=development
> set FLASK_ENV=development
> $env:FLASK_ENV = "development"

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

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

Всё же есть некоторые проблемы с этим подходом, но если вы хотите использовать декораторы, то этого не избежать. В разделе Становиться больше вы найдете вдохновение о том, как справиться с этим.

Работа с Blueprints

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

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

Spec-Zone.ru

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