Как сделать сайт на Python: от первой страницы до сервера

Сайт на Python пишут на фреймворке: Flask подходит для небольшого проекта, Django для сайта с админкой, FastAPI для API.

Показываем мини-сайт на Flask с шаблонами, формой и базой SQLite, старт на Django и FastAPI, выкладку через Gunicorn и Nginx и ошибки, которые ловят новички.

Код можно копировать и запускать, а в конце собраны курсы, если нужно обучение веб-разработке на Python.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3192 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3846 экспертных мнений Подписаться на Телеграм-канал
Обложка: Как сделать сайт на Python: от первой страницы до сервера

Сайт на Python пишут на веб-фреймворке: Flask подойдёт для небольшого сайта, Django выбирают для проекта с админкой и личными кабинетами, а FastAPI берут, когда сайту нужен API для приложения или фронтенда. Python работает на сервере: принимает запрос из браузера, достаёт данные из базы и отдаёт готовую HTML-страницу. Внешний вид всё равно задают HTML и CSS.

Самая короткая рабочая версия сайта на Flask занимает восемь строк и запускается одной командой. Ниже разберём весь путь: что поставить, какой фреймворк выбрать, как собрать мини-сайт с базой и формой и как выложить его в интернет. Если Python у вас ещё не установлен, начните с инструкции по установке Python на Windows, macOS и Linux.

CheckroiCheckroiПодборка курсов по Python569 курсов • 52 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что нужно, чтобы сделать сайт на Python

Рой собирает свой первый сайт на Python за ноутбуком

Сайт на питоне собирается из нескольких слоёв. Почти все они бесплатные и ставятся за вечер.

Что Зачем Чем закрыть на старте
Python 3 Язык, на котором пишется серверная часть Свежая версия с python.org
Виртуальное окружение Держит библиотеки проекта отдельно от системы Встроенный модуль venv
Веб-фреймворк Маршруты, обработка запросов, шаблоны Flask, Django или FastAPI
HTML и CSS Разметка и внешний вид страниц Шаблоны в папке templates
База данных Хранит заметки, товары, пользователей SQLite, она уже встроена в Python
Сервер приложения и веб-сервер Запуск сайта для посетителей Gunicorn и Nginx на VPS

Про базу стоит сказать отдельно. Модуль sqlite3 входит в стандартную библиотеку, и отдельный сервер базы данных ему не нужен: вся база лежит в одном файле. Для учебного сайта этого хватает с запасом.

Редактор кода подойдёт любой. Если ещё не выбрали, посмотрите сравнение сред разработки для Python.

Как работает сайт на Python

Схема пути запроса от браузера к серверу и обратно на столе

Python в браузере посетителя не выполняется: там работает JavaScript. Код на питоне живёт на сервере и включается, когда приходит запрос. Вот что происходит, когда человек открывает страницу вашего сайта:

  1. Браузер отправляет запрос, например GET /about.
  2. Веб-сервер Nginx принимает его и передаёт серверу приложения, Gunicorn или Uvicorn.
  3. Фреймворк находит функцию, которая отвечает за адрес /about. Такая связка адреса и функции называется маршрутом.
  4. Функция делает свою работу: читает базу, проверяет форму, считает.
  5. Результат подставляется в HTML-шаблон, и готовая страница уходит обратно в браузер.

Из этой схемы видно, почему без HTML не обойтись. Python решает, что показать, а как это выглядит, описывает разметка. Поэтому основы HTML и CSS придётся выучить в любом случае, даже если вы идёте в бэкенд.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Flask, Django или FastAPI: какой фреймворк взять

На официальном сайте Python в списке для веб-разработки стоят Django, Pyramid, Bottle, Tornado, Flask, Litestar и FastAPI. Ниже разберём три из них, с которых чаще всего начинают: Flask, Django и FastAPI.

Фреймворк Что даёт из коробки Когда брать
Flask Маршруты, шаблоны Jinja, отладчик. Остальное подключается расширениями Первый сайт, блог, небольшой сервис, учебный проект
Django Модели и миграции базы, готовую админку, пользователей, формы Магазин, каталог, сайт с личным кабинетом и контент-менеджером
FastAPI Проверку типов данных и автоматическую документацию API Сервер для мобильного приложения, фронтенда на React или бота

Решение: учиться удобнее на Flask, потому что в нём каждую деталь пишете вы сами. Когда понадобятся админка и пользователи, переходите на Django. Сравнить программы обучения по обоим фреймворкам можно в каталоге курсов Python. Чем занимаются разработчики на Django, рассказываем в статье кто такой Django-разработчик.

Если нужен лендинг или сайт-визитка без базы и форм, Python не нужен вовсе. Хватит HTML и CSS: посмотрите пять примеров HTML-кода сайта и выложите файлы на любой хостинг.

Как сделать сайт на Python пошагово на Flask

Соберём мини-сайт «Мои заметки»: главная со списком, форма добавления, страница «О сайте» и база SQLite. Примеры проверены на Python 3.14 и Flask 3.1. Самая свежая версия Python на ноябрь 2026 года — 3.15, она вышла в октябре.

Шаг 1: создайте папку проекта и виртуальное окружение

Flask поддерживает Python 3.9 и новее. Откройте терминал и выполните:

mkdir mysite
cd mysite
python3 -m venv .venv
. .venv/bin/activate
pip install flask

Это команды для macOS и Linux. В Windows окружение создаётся через python -m venv .venv, а включается командой .venv\Scripts\activate.bat в cmd или .venv\Scripts\Activate.ps1 в PowerShell. Эти команды приведены в документации модуля venv.

После активации в начале строки терминала появится (.venv). Что делать, если окружение не включается, разобрано в статье про виртуальное окружение Python.

Шаг 2: напишите первую страницу

Создайте в папке файл app.py:

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return "Привет! Это мой первый сайт на Python"

Запустите его с режимом отладки:

flask --app app run --debug

Терминал ответит так:

 * Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 459-727-984

Откройте в браузере http://127.0.0.1:5000 и увидите строку приветствия. Режим --debug сам перезапускает сервер после каждого сохранения файла и показывает ошибки прямо на странице.

Шаг 3: добавьте шаблоны и стили

Строка в return годится только для проверки. Настоящие страницы Flask берёт из папки templates, а картинки и CSS берёт из static. Структура проекта получится такой:

mysite/
├── app.py
├── templates/
│   ├── base.html
│   ├── index.html
│   └── about.html
└── static/
    └── style.css

В base.html лежит общий каркас: шапка, меню, подключение стилей. Остальные страницы наследуют его и меняют только середину.

<!doctype html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <title>{% block title %}Мои заметки{% endblock %}</title>
  <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
  <nav>
    <a href="{{ url_for('index') }}">Главная</a>
    <a href="{{ url_for('about') }}">О сайте</a>
  </nav>
  <main>{% block content %}{% endblock %}</main>
</body>
</html>

Главная страница index.html выводит форму и список заметок:

{% extends "base.html" %}
{% block content %}
  <h1>Мои заметки</h1>
  <form action="{{ url_for('add_note') }}" method="post">
    <input name="text" placeholder="Новая заметка" required>
    <button type="submit">Добавить</button>
  </form>
  <ul>
    {% for note in notes %}
      <li>{{ note.text }}</li>
    {% else %}
      <li>Заметок пока нет</li>
    {% endfor %}
  </ul>
{% endblock %}

Страница about.html устроена так же: {% extends "base.html" %} и один абзац в блоке content. Для style.css хватит пары правил, как подключать стили к HTML, разобрано в статье про CSS.

Шаг 4: подключите базу данных и форму

Теперь замените содержимое app.py полной версией. Она создаёт таблицу при запуске, показывает заметки и сохраняет новые из формы:

import sqlite3

from flask import Flask, redirect, render_template, request, url_for

app = Flask(__name__)
DB_PATH = "notes.db"


def get_db():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    return conn


def init_db():
    with get_db() as conn:
        conn.execute(
            "CREATE TABLE IF NOT EXISTS notes ("
            "id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT NOT NULL)"
        )


@app.route("/")
def index():
    with get_db() as conn:
        notes = conn.execute("SELECT id, text FROM notes ORDER BY id DESC").fetchall()
    return render_template("index.html", notes=notes)


@app.post("/add")
def add_note():
    text = request.form.get("text", "").strip()
    if text:
        with get_db() as conn:
            conn.execute("INSERT INTO notes (text) VALUES (?)", (text,))
    return redirect(url_for("index"))


@app.route("/about")
def about():
    return render_template("about.html")


init_db()

Три детали в этом коде защищают сайт:

  • Знак ? в запросе вместо склейки строк. Текст из формы попадает в базу как данные, а не как часть SQL-команды.
  • Редирект после сохранения. Если посетитель обновит страницу, форма не отправится второй раз.
  • Экранирование в шаблонах. Jinja по документации Flask экранирует значения в файлах .html сама, поэтому чужой <script> в заметке выведется текстом.

Типы колонок вроде INTEGER и TEXT разобраны в таблице типов данных SQL.

Шаг 5: проверьте, что всё работает

Запустите сервер той же командой flask --app app run --debug, добавьте пару заметок и пройдите по меню. Вот что должно получиться:

  • главная отдаёт код 200 и «Заметок пока нет» на пустой базе;
  • отправка формы возвращает редирект 302 на главную, заметка появляется сверху списка;
  • пустая строка из пробелов не сохраняется;
  • заметка <script>alert(1)</script> выводится текстом;
  • прямой заход на /add из адресной строки даёт 405, потому что маршрут принимает только POST.
Мини-сайт на Flask: главная со списком заметок и формой добавления
Так выглядит мини-сайт из шагов 3–5 после трёх добавленных заметок: меню из base.html, форма и список, новые записи сверху.

Это и есть сайт на питоне с нуля: маршруты, шаблоны, база и форма. Дальше его можно наращивать. Как добавить в адрес переменные и отдать JSON, разобрано в подробной статье про Flask.

Тот же старт на Django и FastAPI

Принцип у всех фреймворков общий: маршрут, функция-обработчик, ответ. Различается то, сколько готового вы получаете сразу.

Django: проект с готовой админкой

Django 6.1 по таблице совместимости работает с Python 3.12 и новее. В активированном окружении:

pip install django
django-admin startproject mysite .
python manage.py migrate
python manage.py runserver

Сервер разработки Django слушает порт 8000, поэтому сайт откроется по адресу http://127.0.0.1:8000. По умолчанию проект хранит данные в SQLite, а команда migrate создаёт в ней таблицы для пользователей и админки.

Стартовая страница Django 6.1 после команды runserver на 127.0.0.1:8000
Эту страницу Django показывает сразу после startproject и runserver, пока в проекте нет своих маршрутов.

Команда startproject создаёт файл manage.py для управления проектом и папку mysite с настройками. Главных файлов в ней два: settings.py, где подключаются база и приложения, и urls.py, где адреса связываются с обработчиками. Сами страницы Django предлагает раскладывать по отдельным приложениям: блог, каталог, личный кабинет.

Админка уже подключена по адресу /admin/. Чтобы войти, создайте учётную запись командой python manage.py createsuperuser, как в учебнике Django. В Flask такую панель пришлось бы писать самому.

FastAPI: когда сайту нужен API

FastAPI отдаёт не HTML-страницы, а данные в JSON для приложения, фронтенда или бота. Что такое API и зачем он нужен, мы объясняли простыми словами. Установка и минимальный файл main.py:

pip install "fastapi[standard]"
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"message": "Привет от FastAPI"}


@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

Запускается он командой fastapi dev main.py. Адрес /items/42 вернёт {"item_id":42}, а на /items/abc придёт ошибка 422: FastAPI сам проверил, что в адресе должно быть целое число. По адресу /docs появится автоматическая интерактивная документация со списком всех маршрутов.

Автоматическая документация FastAPI по адресу /docs с двумя маршрутами
Страницу /docs FastAPI собрал сам из двух функций в main.py: маршруты / и /items/{item_id}.

Как выложить сайт на Python в интернет

Рой радуется, что его сайт открылся в интернете

Команды flask run и runserver нужны только для разработки. Документация Flask прямо пишет, что встроенный сервер нельзя использовать в продакшене, а включённый отладчик, по её же словам, позволяет выполнить любой Python-код из браузера. Для посетителей сайт запускают иначе.

  1. Арендуйте сервер. Подойдёт VPS с Linux у любого хостера, критерии выбора есть в разборе хостингов.
  2. Перенесите код. Удобнее всего через Git: на сервере выполните git clone своего репозитория. Если Git пока незнаком, начните со статьи про Git простыми словами.
  3. Поставьте зависимости. Создайте на сервере виртуальное окружение и установите библиотеки из файла requirements.txt. Как его собрать, рассказываем в отдельной инструкции.
  4. Запустите сайт через Gunicorn. Команда gunicorn -w 4 'app:app' поднимет четыре рабочих процесса. Мини-сайт из этой статьи запускается под Gunicorn без правок кода.
  5. Поставьте перед ним Nginx. Он принимает запросы на портах 80 и 443 и передаёт их Gunicorn. Flask советует такую схему, потому что Gunicorn не стоит запускать от root.
  6. Привяжите домен и включите HTTPS. Без сертификата браузеры помечают сайт как небезопасный.

Gunicorn не работает в Windows, только в WSL. Обычно это не мешает: серверы под сайты почти всегда на Linux, а на своём компьютере вы запускаете flask run.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Частые ошибки и что с ними делать

Вот что обычно видно в терминале или браузере, когда сайт не запускается, и как это исправить.

Что видите Почему Что сделать
ModuleNotFoundError: No module named 'flask' Flask стоит в окружении, а терминал запущен без него Активируйте .venv и запустите снова
jinja2.exceptions.TemplateNotFound и ошибка 500 Папка названа template или лежит не рядом с app.py Переименуйте в templates, во множественном числе
Address already in use Порт занят другой программой или вторым запуском сайта Закройте старый сервер или запустите с --port 8000
На Mac по адресу localhost:5000 ошибка 403 Порт 5000 занимает служба AirPlay Откройте 127.0.0.1:5000, смените порт или выключите приёмник AirPlay
405 Method Not Allowed Маршрут ждёт POST, а пришёл GET Проверьте method="post" у формы и декоратор маршрута
Сайт открывается только на вашем компьютере Сервер разработки слушает адрес 127.0.0.1 Для доступа извне выкладывайте сайт через Gunicorn и Nginx

Ошибку с портом 5000 на маке труднее всего заметить. Сервер Flask стартует без жалоб, а в браузере открывается чужой ответ с ошибкой 403. В таблице портов Apple порт 5000 закреплён за AirPlay, а документация Flask уточняет, что служба запускается сама начиная с macOS Monterey.

Ошибки в собственном коде удобно ловить через try и except, это разобрано в статье про обработку исключений.

Что изучить дальше, чтобы делать сайты на питоне

Мини-сайт из этой статьи закрывает только первый шаг. Чтобы делать проекты под заказ или устроиться бэкенд-разработчиком, понадобится ещё несколько тем:

  1. HTML и CSS на уровне вёрстки простых страниц: основные теги HTML закрывают большую часть задач.
  2. SQL и одна «взрослая» база, обычно PostgreSQL. Её рекомендует для продакшена документация Django.
  3. Протокол HTTP: методы, коды ответов, заголовки, куки.
  4. Git и Linux на уровне ежедневной работы с сервером.
  5. Один фреймворк глубоко. Если цель в том, чтобы найти работу, чаще берут Django.

Как из этих тем собрать план на год, рассказываем в статье как стать backend-разработчиком. Про саму профессию читайте в обзоре Python-разработчик: чем занимается и сколько зарабатывает.

Где освоить веб-разработку на Python системно

Мини-сайт на Flask собирается за вечер по инструкции. А вот проект с пользователями, оплатой и нагрузкой требует системных знаний: архитектуры, тестов, безопасности, работы с сервером. Их дают курсы с практикой и проверкой кода. Ниже собрана подборка курсов по Python из нашего каталога, а программы с упором на Django собраны на странице курсов по Django.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 754 ₽4108 ₽/мес.9 месяцевОбзор курса
Профессия Python-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Можно ли написать сайт на Python?

Да. Python отвечает за серверную часть сайта: маршруты, работу с базой, обработку форм. Внешний вид страниц задают HTML и CSS в шаблонах, а для сайта-визитки без базы и форм Python не нужен.

Что лучше для сайта: Django или Flask?

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

Как сделать сайт на питоне с нуля?

Установите Python, создайте виртуальное окружение, поставьте Flask и напишите файл app.py с одним маршрутом. Запустите его командой flask --app app run, а затем добавьте шаблоны в папку templates и базу SQLite. Подробно про окружение рассказываем в статье про venv.

Нужно ли знать HTML, чтобы делать сайты на Python?

Да, хотя бы основы. Python решает, какие данные показать, а разметку и внешний вид страницы описывают HTML и CSS.

Можно ли запустить Python прямо на странице сайта?

Обычный сайт выполняет Python на сервере, а браузер получает уже готовую HTML-страницу. В самом браузере посетителя работает JavaScript.

Как выложить сайт на Python в интернет?

Арендуйте VPS с Linux, перенесите код через Git, установите зависимости из requirements.txt, запустите сайт через Gunicorn и поставьте перед ним Nginx. Встроенный сервер flask run подходит только для разработки.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!