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

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

Python в браузере посетителя не выполняется: там работает JavaScript. Код на питоне живёт на сервере и включается, когда приходит запрос. Вот что происходит, когда человек открывает страницу вашего сайта:
- Браузер отправляет запрос, например
GET /about. - Веб-сервер Nginx принимает его и передаёт серверу приложения, Gunicorn или Uvicorn.
- Фреймворк находит функцию, которая отвечает за адрес
/about. Такая связка адреса и функции называется маршрутом. - Функция делает свою работу: читает базу, проверяет форму, считает.
- Результат подставляется в 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.

Это и есть сайт на питоне с нуля: маршруты, шаблоны, база и форма. Дальше его можно наращивать. Как добавить в адрес переменные и отдать 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 создаёт в ней таблицы для пользователей и админки.

Команда 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 появится автоматическая интерактивная документация со списком всех маршрутов.

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

Команды flask run и runserver нужны только для разработки. Документация Flask прямо пишет, что встроенный сервер нельзя использовать в продакшене, а включённый отладчик, по её же словам, позволяет выполнить любой Python-код из браузера. Для посетителей сайт запускают иначе.
- Арендуйте сервер. Подойдёт VPS с Linux у любого хостера, критерии выбора есть в разборе хостингов.
- Перенесите код. Удобнее всего через Git: на сервере выполните
git cloneсвоего репозитория. Если Git пока незнаком, начните со статьи про Git простыми словами. - Поставьте зависимости. Создайте на сервере виртуальное окружение и установите библиотеки из файла
requirements.txt. Как его собрать, рассказываем в отдельной инструкции. - Запустите сайт через Gunicorn. Команда
gunicorn -w 4 'app:app'поднимет четыре рабочих процесса. Мини-сайт из этой статьи запускается под Gunicorn без правок кода. - Поставьте перед ним Nginx. Он принимает запросы на портах 80 и 443 и передаёт их Gunicorn. Flask советует такую схему, потому что Gunicorn не стоит запускать от root.
- Привяжите домен и включите HTTPS. Без сертификата браузеры помечают сайт как небезопасный.
Gunicorn не работает в Windows, только в WSL. Обычно это не мешает: серверы под сайты почти всегда на Linux, а на своём компьютере вы запускаете flask run.
Частые ошибки и что с ними делать
Вот что обычно видно в терминале или браузере, когда сайт не запускается, и как это исправить.
| Что видите | Почему | Что сделать |
|---|---|---|
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, это разобрано в статье про обработку исключений.
Что изучить дальше, чтобы делать сайты на питоне
Мини-сайт из этой статьи закрывает только первый шаг. Чтобы делать проекты под заказ или устроиться бэкенд-разработчиком, понадобится ещё несколько тем:
- HTML и CSS на уровне вёрстки простых страниц: основные теги HTML закрывают большую часть задач.
- SQL и одна «взрослая» база, обычно PostgreSQL. Её рекомендует для продакшена документация Django.
- Протокол HTTP: методы, коды ответов, заголовки, куки.
- Git и Linux на уровне ежедневной работы с сервером.
- Один фреймворк глубоко. Если цель в том, чтобы найти работу, чаще берут Django.
Как из этих тем собрать план на год, рассказываем в статье как стать backend-разработчиком. Про саму профессию читайте в обзоре Python-разработчик: чем занимается и сколько зарабатывает.
Где освоить веб-разработку на Python системно
Мини-сайт на Flask собирается за вечер по инструкции. А вот проект с пользователями, оплатой и нагрузкой требует системных знаний: архитектуры, тестов, безопасности, работы с сервером. Их дают курсы с практикой и проверкой кода. Ниже собрана подборка курсов по Python из нашего каталога, а программы с упором на Django собраны на странице курсов по Django.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 754 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Профессия Python-разработчик Перейти на сайт курса | 140 040 ₽ | 3890 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




