{
  "id": 488,
  "title": "Flask с нуля: первое веб-приложение на Python за 17 минут",
  "speaker": "Corey Schafer",
  "topic": "Пошаговое руководство по созданию первого веб-приложения на Flask: установка, маршруты, режим отладки и структура проекта.",
  "duration_label": "17:08",
  "theses": [
    {
      "title": "Flask — микрофреймворк, идеальный для старта",
      "description": "Flask позиционируется как микрофреймворк, что делает его отличным выбором для изучения веб-разработки на Python. Он не перегружен абстракциями и позволяет быстро получить работающий результат. При этом фреймворк достаточно мощный для создания полноценных приложений с авторизацией, базами данных и загрузкой файлов."
    },
    {
      "title": "Минимальное приложение Flask — всего 5 строк кода",
      "description": "Для запуска веб-приложения достаточно импортировать класс Flask, создать экземпляр приложения и определить одну функцию-обработчик с декоратором маршрута. Переменная __name__ передаётся в конструктор Flask, чтобы фреймворк знал, где искать шаблоны и статические файлы."
    },
    {
      "title": "Маршруты определяются через декораторы",
      "description": "Декоратор @app.route('/path') привязывает URL-адрес к функции-обработчику. Функция возвращает содержимое страницы — текст или HTML. Декораторы скрывают сложную логику маршрутизации и позволяют сосредоточиться на бизнес-логике."
    },
    {
      "title": "Один обработчик может иметь несколько маршрутов",
      "description": "К одной функции можно привязать несколько декораторов @app.route. Например, и '/' и '/home' могут вести на одну и ту же домашнюю страницу. Это удобно для создания алиасов и поддержки обратной совместимости URL-адресов."
    },
    {
      "title": "Два способа запуска Flask-приложения",
      "description": "Первый способ — через команду flask run с установленными переменными окружения FLASK_APP и FLASK_DEBUG. Второй — напрямую через python flaskblog.py с блоком if __name__ == '__main__' и вызовом app.run(debug=True). Оба способа равноценны, но flask run предпочтительнее по документации."
    },
    {
      "title": "Режим отладки автоматически перезагружает сервер",
      "description": "Без режима отладки каждое изменение кода требует ручной остановки и перезапуска сервера. Включение debug mode (FLASK_DEBUG=1 или debug=True) позволяет серверу автоматически отслеживать изменения файлов и перезагружаться. Это критически важно для продуктивной разработки."
    },
    {
      "title": "Виртуальные окружения — обязательная практика",
      "description": "Каждый проект должен работать в изолированном виртуальном окружении, чтобы зависимости разных проектов не конфликтовали. Хотя Flask можно установить глобально, для реальных проектов это антипаттерн."
    },
    {
      "title": "Переменная __name__ определяет контекст запуска",
      "description": "Когда скрипт запускается напрямую, __name__ равен '__main__'. При импорте модуля __name__ равен имени модуля. Этот механизм используется и для передачи контекста Flask, и для условного запуска сервера разработки."
    },
    {
      "title": "localhost и 127.0.0.1 — одно и то же",
      "description": "Flask-сервер по умолчанию запускается на 127.0.0.1:5000. Адрес localhost — это алиас для 127.0.0.1. Оба варианта указывают на локальную машину и равноценны для доступа к приложению в браузере."
    },
    {
      "title": "Просмотр исходного кода страницы — инструмент отладки",
      "description": "В любом браузере можно просмотреть HTML-код страницы через правый клик → «Просмотр исходного кода». Это позволяет убедиться, что сервер возвращает именно тот HTML, который вы ожидаете, и быстро находить ошибки в разметке."
    }
  ],
  "exercises": [
    {
      "goal": "Установите Flask командой pip install flask. Откройте интерпретатор Python и выполните import flask — если ошибок нет, установка прошла успешно. Создайте отдельную директорию для проекта и откройте её в вашем текстовом редакторе.",
      "title": "Установка Flask и проверка работоспособности"
    },
    {
      "goal": "Создайте файл flaskblog.py с минимальным кодом: импорт Flask, создание экземпляра app, один маршрут '/' возвращающий текст. Запустите через переменные окружения (export FLASK_APP=flaskblog.py && flask run) и откройте localhost:5000 в браузере. Убедитесь, что текст отображается.",
      "title": "Создание минимального Flask-приложения"
    },
    {
      "goal": "Установите переменную FLASK_DEBUG=1 и перезапустите сервер. Измените текст, возвращаемый маршрутом, сохраните файл и обновите страницу в браузере без перезапуска сервера. Убедитесь, что изменения применились автоматически. Попробуйте также альтернативный запуск через if __name__ == '__main__': app.run(debug=True).",
      "title": "Включение режима отладки и тестирование горячей перезагрузки"
    },
    {
      "goal": "Создайте второй маршрут /about с отдельной функцией-обработчиком. Верните HTML с заголовком h1. Проверьте, что обе страницы ('/' и '/about') работают. Попробуйте перейти на несуществующий маршрут и изучите ответ 404 в терминале.",
      "title": "Добавление страницы «О проекте»"
    },
    {
      "goal": "Добавьте к домашней странице второй декоратор @app.route('/home'), чтобы и '/' и '/home' вели на одну страницу. Проверьте оба URL в браузере. Подумайте, в каких случаях это может быть полезно в реальном проекте — например, редирект со старого URL на новый.",
      "title": "Множественные маршруты для одного обработчика"
    },
    {
      "goal": "Замените простой текст в return на HTML-код с разными тегами: h1, p, ul/li. Обновите страницу и просмотрите исходный код через правый клик → «Просмотр исходного кода». Обратите внимание, как браузер рендерит HTML. Это поможет понять, зачем в следующих уроках понадобятся шаблоны.",
      "title": "Эксперимент с HTML-разметкой в ответах"
    }
  ],
  "quotes": [
    {
      "text": "Flask — это отличный микрофреймворк, который действительно делает работу с серверными веб-приложениями приятной (Flask is an excellent micro framework that really makes it enjoyable to work with these back-end web applications)",
      "author": "Corey Schafer"
    },
    {
      "text": "Создание подобного приложения — отличный способ изучить все тонкости фреймворка, потому что нам придётся работать с базами данных, пользовательским вводом из форм, сохранением картинок и отправкой писем (building an application like this is a great way to learn the ins and outs of a framework)",
      "author": "Corey Schafer"
    },
    {
      "text": "Декораторы — это просто способ добавить дополнительную функциональность к существующим функциям (decorators are just a way to add additional functionality to existing functions)",
      "author": "Corey Schafer"
    },
    {
      "text": "Это работающий веб-сервер, он встроен прямо в 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)",
      "author": "Corey Schafer"
    },
    {
      "text": "Скорее всего при разработке сайта вы будете вносить множество изменений, и было бы очень неудобно каждый раз останавливать и перезапускать веб-сервер при каждом маленьком изменении (it would be a major pain to have to shut down and restart the web server each time you make a small change)",
      "author": "Corey Schafer"
    },
    {
      "text": "Всегда хорошая идея — разделять разные проекты в их собственные виртуальные окружения (it's always a good idea to separate different projects into their own virtual environments)",
      "author": "Corey Schafer"
    },
    {
      "text": "Декораторы могут быть запутанной темой, но вам не обязательно понимать, как они работают, чтобы использовать Flask (decorators can be a confusing topic but you don't really need to understand how they work in order to use flask)",
      "author": "Corey Schafer"
    },
    {
      "text": "Если мы хотим, чтобы несколько маршрутов обрабатывались одной функцией, достаточно просто добавить ещё один декоратор (if we ever wanted to have multiple routes handled by the same function then it's as simple as just adding another decorator)",
      "author": "Corey Schafer"
    }
  ],
  "full_markdown": "# Flask с нуля: первое веб-приложение на Python за 17 минут\n\n> Спикер: Corey Schafer | Длительность: 17:08\n\n## Ключевые идеи\n\n1. **Flask — микрофреймворк для комфортной веб-разработки** — Flask не перегружен абстракциями и позволяет быстро получить работающий результат. При этом он достаточно мощный для полноценных приложений с авторизацией, базами данных и загрузкой файлов.\n\n2. **Минимальное приложение — 5 строк кода** — Импорт класса Flask, создание экземпляра app, один декоратор маршрута и функция-обработчик — этого достаточно для запуска веб-сервера.\n\n3. **Маршруты через декораторы @app.route** — Декоратор привязывает URL к функции. Функция возвращает содержимое страницы. Не нужно глубоко понимать декораторы, чтобы начать использовать Flask.\n\n4. **Один обработчик — несколько маршрутов** — К функции можно привязать несколько декораторов, чтобы разные URL вели на одну страницу.\n\n5. **Два способа запуска** — Через `flask run` с переменными окружения или напрямую через `python flaskblog.py` с блоком `if __name__ == '__main__'`.\n\n6. **Режим отладки — must have при разработке** — Debug mode автоматически перезагружает сервер при изменении кода. Без него каждое изменение требует ручного перезапуска.\n\n7. **Виртуальные окружения** — Изоляция зависимостей проекта — обязательная практика для любого Python-проекта.\n\n8. **__name__ определяет контекст** — Эта переменная равна '__main__' при прямом запуске и имени модуля при импорте. Используется и для Flask, и для условного запуска.\n\n9. **localhost:5000 — адрес по умолчанию** — Flask-сервер запускается на 127.0.0.1:5000, localhost — удобный алиас для этого адреса.\n\n10. **Просмотр исходного кода в браузере** — Правый клик → «Просмотр исходного кода» помогает отлаживать HTML-ответы сервера.\n\n## Транскрипт\n\n### Введение: что будем строить\n\nВ этой серии видео мы создадим полноценное веб-приложение на фреймворке Flask. Это будет блог-платформа, где разные пользователи могут создавать посты. Приложение включает систему управления пользователями: регистрацию, авторизацию, сброс пароля по email. Пользователи смогут обновлять профиль, загружать аватары (с автоматическим ресайзом на сервере), создавать, редактировать и удалять посты.\n\nПостроение такого приложения — отличный способ изучить фреймворк, потому что придётся работать с базами данных, формами, файловой системой, отправкой email и многим другим.\n\n### Установка Flask\n\nУстановка выполняется через pip. Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта:\n\n```\npip install flask\n```\n\nПроверка установки — открыть интерпретатор Python и выполнить `import flask`. Если ошибок нет — всё установлено корректно.\n\n### Создание проекта\n\nСоздаём директорию проекта и в ней файл `flaskblog.py`. Минимальный код приложения:\n\n```python\nfrom flask import Flask\napp = Flask(__name__)\n\n@app.route('/')\ndef hello():\n    return '<h1>Home Page</h1>'\n```\n\nПеременная `__name__` передаётся в конструктор Flask, чтобы фреймворк знал, где искать шаблоны и статические файлы.\n\n### Запуск через flask run\n\nНеобходимо установить переменную окружения:\n\n```\nexport FLASK_APP=flaskblog.py   # Mac/Linux\nset FLASK_APP=flaskblog.py      # Windows\nflask run\n```\n\nСервер запустится на `http://127.0.0.1:5000` (или `http://localhost:5000`).\n\n### Режим отладки\n\nБез debug mode каждое изменение кода требует перезапуска сервера. Включение:\n\n```\nexport FLASK_DEBUG=1\nflask run\n```\n\nТеперь сервер автоматически перезагружается при сохранении файлов.\n\n### Альтернативный запуск через Python\n\nМожно добавить в конец файла блок условного запуска:\n\n```python\nif __name__ == '__main__':\n    app.run(debug=True)\n```\n\nИ запускать напрямую: `python flaskblog.py`.\n\n### Добавление маршрутов\n\nНовые страницы создаются добавлением маршрутов с декораторами:\n\n```python\n@app.route('/about')\ndef about():\n    return '<h1>About Page</h1>'\n```\n\nМожно привязать несколько URL к одной функции:\n\n```python\n@app.route('/')\n@app.route('/home')\ndef home():\n    return '<h1>Home Page</h1>'\n```\n\n## Практические задания\n\n### Задание 1: Установка Flask и проверка\nУстановите Flask командой `pip install flask`. Откройте интерпретатор Python и выполните `import flask` — если ошибок нет, установка прошла успешно. Создайте отдельную директорию для проекта и откройте её в вашем текстовом редакторе.\n\n### Задание 2: Минимальное приложение\nСоздайте файл `flaskblog.py` с минимальным кодом: импорт Flask, создание экземпляра app, один маршрут '/' возвращающий текст. Запустите через переменные окружения и откройте localhost:5000 в браузере. Убедитесь, что текст отображается.\n\n### Задание 3: Режим отладки\nВключите debug mode и протестируйте горячую перезагрузку: измените текст, сохраните файл и обновите страницу без перезапуска сервера. Попробуйте оба способа запуска — через flask run и через python напрямую.\n\n### Задание 4: Страница «О проекте»\nСоздайте маршрут `/about` с отдельной функцией-обработчиком, возвращающей HTML с заголовком. Проверьте, что обе страницы работают. Попробуйте перейти на несуществующий маршрут и изучите ответ 404.\n\n### Задание 5: Множественные маршруты\nДобавьте к домашней странице второй декоратор `@app.route('/home')`, чтобы и `/` и `/home` вели на одну страницу. Проверьте оба URL в браузере.\n\n### Задание 6: Эксперименты с HTML\nЗамените простой текст на HTML-код с разными тегами: h1, p, ul/li, a. Просмотрите исходный код страницы в браузере. Обратите внимание, насколько неудобно писать HTML прямо в Python-коде — это мотивация для изучения шаблонов в следующем уроке.\n\n## Лучшие цитаты\n\n> «Flask — это отличный микрофреймворк, который действительно делает работу с серверными веб-приложениями приятной» — Corey Schafer\n\n> «Создание подобного приложения — отличный способ изучить все тонкости фреймворка, потому что нам придётся работать с базами данных, пользовательским вводом из форм, сохранением картинок и отправкой писем» — Corey Schafer\n\n> «Декораторы — это просто способ добавить дополнительную функциональность к существующим функциям» — Corey Schafer\n\n> «Это работающий веб-сервер, он встроен прямо в Flask, и его нужно оставить запущенным, пока вы просматриваете свой сайт» — Corey Schafer\n\n> «Было бы очень неудобно каждый раз останавливать и перезапускать веб-сервер при каждом маленьком изменении» — Corey Schafer\n\n> «Всегда хорошая идея — разделять разные проекты в их собственные виртуальные окружения» — Corey Schafer\n\n> «Декораторы могут быть запутанной темой, но вам не обязательно понимать, как они работают, чтобы использовать Flask» — Corey Schafer\n\n> «Если мы хотим, чтобы несколько маршрутов обрабатывались одной функцией, достаточно просто добавить ещё один декоратор» — Corey Schafer",
  "youtube_url": "https://www.youtube.com/watch?v=MwZwr5Tvyxo",
  "url": "https://ekstraktznaniy.ru/workbook/488"
}