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

## Метаданные

- **Спикер:** Corey Schafer
- **Канал:** Corey Schafer
- **Тема:** Пошаговое руководство по созданию первого веб-приложения на Flask: установка, маршруты, режим отладки и структура проекта.
- **Длительность:** 17:08
- **YouTube:** https://www.youtube.com/watch?v=MwZwr5Tvyxo
- **Источник:** https://ekstraktznaniy.ru/workbook/488

## Ключевые тезисы

1. **Flask — микрофреймворк, идеальный для старта** — Flask позиционируется как микрофреймворк, что делает его отличным выбором для изучения веб-разработки на Python. Он не перегружен абстракциями и позволяет быстро получить работающий результат. При этом фреймворк достаточно мощный для создания полноценных приложений с авторизацией, базами данных и загрузкой файлов.
2. **Минимальное приложение Flask — всего 5 строк кода** — Для запуска веб-приложения достаточно импортировать класс Flask, создать экземпляр приложения и определить одну функцию-обработчик с декоратором маршрута. Переменная __name__ передаётся в конструктор Flask, чтобы фреймворк знал, где искать шаблоны и статические файлы.
3. **Маршруты определяются через декораторы** — Декоратор @app.route('/path') привязывает URL-адрес к функции-обработчику. Функция возвращает содержимое страницы — текст или HTML. Декораторы скрывают сложную логику маршрутизации и позволяют сосредоточиться на бизнес-логике.
4. **Один обработчик может иметь несколько маршрутов** — К одной функции можно привязать несколько декораторов @app.route. Например, и '/' и '/home' могут вести на одну и ту же домашнюю страницу. Это удобно для создания алиасов и поддержки обратной совместимости URL-адресов.
5. **Два способа запуска Flask-приложения** — Первый способ — через команду flask run с установленными переменными окружения FLASK_APP и FLASK_DEBUG. Второй — напрямую через python flaskblog.py с блоком if __name__ == '__main__' и вызовом app.run(debug=True). Оба способа равноценны, но flask run предпочтительнее по документации.
6. **Режим отладки автоматически перезагружает сервер** — Без режима отладки каждое изменение кода требует ручной остановки и перезапуска сервера. Включение debug mode (FLASK_DEBUG=1 или debug=True) позволяет серверу автоматически отслеживать изменения файлов и перезагружаться. Это критически важно для продуктивной разработки.
7. **Виртуальные окружения — обязательная практика** — Каждый проект должен работать в изолированном виртуальном окружении, чтобы зависимости разных проектов не конфликтовали. Хотя Flask можно установить глобально, для реальных проектов это антипаттерн.
8. **Переменная __name__ определяет контекст запуска** — Когда скрипт запускается напрямую, __name__ равен '__main__'. При импорте модуля __name__ равен имени модуля. Этот механизм используется и для передачи контекста Flask, и для условного запуска сервера разработки.
9. **localhost и 127.0.0.1 — одно и то же** — Flask-сервер по умолчанию запускается на 127.0.0.1:5000. Адрес localhost — это алиас для 127.0.0.1. Оба варианта указывают на локальную машину и равноценны для доступа к приложению в браузере.
10. **Просмотр исходного кода страницы — инструмент отладки** — В любом браузере можно просмотреть HTML-код страницы через правый клик → «Просмотр исходного кода». Это позволяет убедиться, что сервер возвращает именно тот HTML, который вы ожидаете, и быстро находить ошибки в разметке.

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

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

### Задание 2: Создание минимального Flask-приложения
**Цель:** Создайте файл flaskblog.py с минимальным кодом: импорт Flask, создание экземпляра app, один маршрут '/' возвращающий текст. Запустите через переменные окружения (export FLASK_APP=flaskblog.py && flask run) и откройте localhost:5000 в браузере. Убедитесь, что текст отображается.

### Задание 3: Включение режима отладки и тестирование горячей перезагрузки
**Цель:** Установите переменную FLASK_DEBUG=1 и перезапустите сервер. Измените текст, возвращаемый маршрутом, сохраните файл и обновите страницу в браузере без перезапуска сервера. Убедитесь, что изменения применились автоматически. Попробуйте также альтернативный запуск через if __name__ == '__main__': app.run(debug=True).

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

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

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

## Ключевые цитаты

> «Flask — это отличный микрофреймворк, который действительно делает работу с серверными веб-приложениями приятной (Flask is an excellent micro framework that really makes it enjoyable to work with these back-end web applications)»
> — Corey Schafer

> «Создание подобного приложения — отличный способ изучить все тонкости фреймворка, потому что нам придётся работать с базами данных, пользовательским вводом из форм, сохранением картинок и отправкой писем (building an application like this is a great way to learn the ins and outs of a framework)»
> — Corey Schafer

> «Декораторы — это просто способ добавить дополнительную функциональность к существующим функциям (decorators are just a way to add additional functionality to existing functions)»
> — Corey Schafer

> «Это работающий веб-сервер, он встроен прямо в Flask, и его нужно оставить запущенным, пока вы просматриваете свой сайт (this is a running web server this actually comes with flask itself and you have to leave this running while you're viewing your site)»
> — Corey Schafer

> «Скорее всего при разработке сайта вы будете вносить множество изменений, и было бы очень неудобно каждый раз останавливать и перезапускать веб-сервер при каждом маленьком изменении (it would be a major pain to have to shut down and restart the web server each time you make a small change)»
> — Corey Schafer

> «Всегда хорошая идея — разделять разные проекты в их собственные виртуальные окружения (it's always a good idea to separate different projects into their own virtual environments)»
> — Corey Schafer

> «Декораторы могут быть запутанной темой, но вам не обязательно понимать, как они работают, чтобы использовать Flask (decorators can be a confusing topic but you don't really need to understand how they work in order to use flask)»
> — Corey Schafer

> «Если мы хотим, чтобы несколько маршрутов обрабатывались одной функцией, достаточно просто добавить ещё один декоратор (if we ever wanted to have multiple routes handled by the same function then it's as simple as just adding another decorator)»
> — Corey Schafer

## Полный текст экстракта

# 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