Структура проекта Flask

Приложение Flask может состоять всего из одного файла.

Например, следующий файл hello.py является приложением Flask:

Пример

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello, World!'

Однако, когда проект становится больше, нереалистично поместить весь код в один файл.

Структура проекта Flask может варьироваться в зависимости от размера и сложности приложения.

Ниже приведены несколько распространённых структур проектов Flask, подходящих соответственно для простых и более сложных приложений.

  1. Простая структура проекта: Подходит для небольших приложений, весь код сосредоточен в одном файле.
  2. Структура проекта среднего размера: Разделяет приложение на несколько модулей для упрощения управления и расширения.
  3. Сложная структура проекта: Поддерживает высокую модульность, подходит для больших приложений, включая маршруты, модели, шаблоны и каталоги статических файлов.

1. Простая структура проекта

Для простого приложения Flask структура проекта может быть очень лаконичной:

my_flask_app/
│
├── app.py
└── requirements.txt
  • app.py: Основной файл приложения Flask, содержащий определения маршрутов и функций представлений.
  • requirements.txt: Перечисляет зависимости проекта, используется для записи информации о версиях Flask и других пакетов.

Код файла app.py в каталоге my_flask_app:

Пример

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

Пример requirements.txt:

Flask==2.2.3

2. Структура проекта среднего размера

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

my_flask_app/
│
├── app/
│   ├── __init__.py
│   ├── routes.py
│   └── models.py
│
├── config.py
├── requirements.txt
└── run.py
  • app/: Содержит основной код приложения Flask.
    • __init__.py: Инициализирует приложение Flask и настраивает расширения.
    • routes.py: Определяет маршруты и функции представлений приложения.
    • models.py: Определяет модели данных приложения.
  • config.py: Файл конфигурации, содержащий информацию о конфигурации приложения.
  • requirements.txt: Перечислите библиотеки зависимостей проекта.
  • run.py: Используется для запуска приложения Flask.

app/__init__.py пример:

Пример

from flask import Flask

def create_app():
    app = Flask(__name__)
    app.config.from_object('config.Config')

    from . import routes
    app.register_blueprint(routes.bp)

    return app

app/routes.py пример:

Пример

from flask import Blueprint

bp = Blueprint('main', __name__)

@bp.route('/')
def home():
    return 'Hello, World!'

run.py пример:

Пример

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

3. Сложная структура проекта

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

my_flask_app/
│
├── app/
│   ├── __init__.py
│   ├── routes/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   └── auth.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── user.py
│   ├── templates/
│   │   ├── layout.html
│   │   └── home.html
│   └── static/
│       ├── css/
│       └── js/
│
├── config.py
├── requirements.txt
├── migrations/
│   └── ...
└── run.py
  • app/routes/: Управляет маршрутами для разных функциональных модулей отдельно.
    • main.py: Маршруты для основного модуля.
    • auth.py: Маршруты, связанные с аутентификацией.
  • app/models/: Управление моделями данных, обычно связанными с операциями с базой данных.
    • user.py: Модель пользователя.
  • app/templates/: Хранение файлов HTML-шаблонов.
  • app/static/:Хранение статических файлов, таких как CSS и JavaScript.
  • migrations/: Файлы миграции базы данных, обычно связанные с SQLAlchemy.

app/routes/main.py пример:

Пример

from flask import Blueprint, render_template

bp = Blueprint('main', __name__)

@bp.route('/')
def home():
    return render_template('home.html')

app/models/user.py пример:

Пример

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True, nullable=False)
Другие расширения