# Flask с нуля: первое веб-приложение на Python за 17 минут

> Спикер: Corey Schafer | Длительность: 17:08

## Ключевые идеи

1. **Flask — микрофреймворк для комфортной веб-разработки** — Flask не перегружен абстракциями и позволяет быстро получить работающий результат. При этом он достаточно мощный для полноценных приложений с авторизацией, базами данных и загрузкой файлов.

2. **Минимальное приложение — 5 строк кода** — Импорт класса Flask, создание экземпляра app, один декоратор маршрута и функция-обработчик — этого достаточно для запуска веб-сервера.

3. **Маршруты через декораторы @app.route** — Декоратор привязывает URL к функции. Функция возвращает содержимое страницы. Не нужно глубоко понимать декораторы, чтобы начать использовать Flask.

4. **Один обработчик — несколько маршрутов** — К функции можно привязать несколько декораторов, чтобы разные URL вели на одну страницу.

5. **Два способа запуска** — Через `flask run` с переменными окружения или напрямую через `python flaskblog.py` с блоком `if __name__ == '__main__'`.

6. **Режим отладки — must have при разработке** — Debug mode автоматически перезагружает сервер при изменении кода. Без него каждое изменение требует ручного перезапуска.

7. **Виртуальные окружения** — Изоляция зависимостей проекта — обязательная практика для любого Python-проекта.

8. **__name__ определяет контекст** — Эта переменная равна '__main__' при прямом запуске и имени модуля при импорте. Используется и для Flask, и для условного запуска.

9. **localhost:5000 — адрес по умолчанию** — Flask-сервер запускается на 127.0.0.1:5000, localhost — удобный алиас для этого адреса.

10. **Просмотр исходного кода в браузере** — Правый клик → «Просмотр исходного кода» помогает отлаживать HTML-ответы сервера.

## Транскрипт

### Введение: что будем строить

В этой серии видео мы создадим полноценное веб-приложение на фреймворке Flask. Это будет блог-платформа, где разные пользователи могут создавать посты. Приложение включает систему управления пользователями: регистрацию, авторизацию, сброс пароля по email. Пользователи смогут обновлять профиль, загружать аватары (с автоматическим ресайзом на сервере), создавать, редактировать и удалять посты.

Построение такого приложения — отличный способ изучить фреймворк, потому что придётся работать с базами данных, формами, файловой системой, отправкой email и многим другим.

### Установка Flask

Установка выполняется через pip. Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта:

```
pip install flask
```

Проверка установки — открыть интерпретатор Python и выполнить `import flask`. Если ошибок нет — всё установлено корректно.

### Создание проекта

Создаём директорию проекта и в ней файл `flaskblog.py`. Минимальный код приложения:

```python
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return '<h1>Home Page</h1>'
```

Переменная `__name__` передаётся в конструктор Flask, чтобы фреймворк знал, где искать шаблоны и статические файлы.

### Запуск через flask run

Необходимо установить переменную окружения:

```
export FLASK_APP=flaskblog.py   # Mac/Linux
set FLASK_APP=flaskblog.py      # Windows
flask run
```

Сервер запустится на `http://127.0.0.1:5000` (или `http://localhost:5000`).

### Режим отладки

Без debug mode каждое изменение кода требует перезапуска сервера. Включение:

```
export FLASK_DEBUG=1
flask run
```

Теперь сервер автоматически перезагружается при сохранении файлов.

### Альтернативный запуск через Python

Можно добавить в конец файла блок условного запуска:

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

И запускать напрямую: `python flaskblog.py`.

### Добавление маршрутов

Новые страницы создаются добавлением маршрутов с декораторами:

```python
@app.route('/about')
def about():
    return '<h1>About Page</h1>'
```

Можно привязать несколько URL к одной функции:

```python
@app.route('/')
@app.route('/home')
def home():
    return '<h1>Home Page</h1>'
```

## Практические задания

### Задание 1: Установка Flask и проверка
Установите Flask командой `pip install flask`. Откройте интерпретатор Python и выполните `import flask` — если ошибок нет, установка прошла успешно. Создайте отдельную директорию для проекта и откройте её в вашем текстовом редакторе.

### Задание 2: Минимальное приложение
Создайте файл `flaskblog.py` с минимальным кодом: импорт Flask, создание экземпляра app, один маршрут '/' возвращающий текст. Запустите через переменные окружения и откройте localhost:5000 в браузере. Убедитесь, что текст отображается.

### Задание 3: Режим отладки
Включите debug mode и протестируйте горячую перезагрузку: измените текст, сохраните файл и обновите страницу без перезапуска сервера. Попробуйте оба способа запуска — через flask run и через python напрямую.

### Задание 4: Страница «О проекте»
Создайте маршрут `/about` с отдельной функцией-обработчиком, возвращающей HTML с заголовком. Проверьте, что обе страницы работают. Попробуйте перейти на несуществующий маршрут и изучите ответ 404.

### Задание 5: Множественные маршруты
Добавьте к домашней странице второй декоратор `@app.route('/home')`, чтобы и `/` и `/home` вели на одну страницу. Проверьте оба URL в браузере.

### Задание 6: Эксперименты с HTML
Замените простой текст на HTML-код с разными тегами: h1, p, ul/li, a. Просмотрите исходный код страницы в браузере. Обратите внимание, насколько неудобно писать HTML прямо в Python-коде — это мотивация для изучения шаблонов в следующем уроке.

## Лучшие цитаты

> «Flask — это отличный микрофреймворк, который действительно делает работу с серверными веб-приложениями приятной» — Corey Schafer

> «Создание подобного приложения — отличный способ изучить все тонкости фреймворка, потому что нам придётся работать с базами данных, пользовательским вводом из форм, сохранением картинок и отправкой писем» — Corey Schafer

> «Декораторы — это просто способ добавить дополнительную функциональность к существующим функциям» — Corey Schafer

> «Это работающий веб-сервер, он встроен прямо в Flask, и его нужно оставить запущенным, пока вы просматриваете свой сайт» — Corey Schafer

> «Было бы очень неудобно каждый раз останавливать и перезапускать веб-сервер при каждом маленьком изменении» — Corey Schafer

> «Всегда хорошая идея — разделять разные проекты в их собственные виртуальные окружения» — Corey Schafer

> «Декораторы могут быть запутанной темой, но вам не обязательно понимать, как они работают, чтобы использовать Flask» — Corey Schafer

> «Если мы хотим, чтобы несколько маршрутов обрабатывались одной функцией, достаточно просто добавить ещё один декоратор» — Corey Schafer