Как запустить сервер Django: команда runserver
Как запустить сервер Django командой python manage.py runserver: порт и адрес, доступ из локальной сети, автоперезагрузка, остановка и частые ошибки.
Содержание · 11 разделов
- Как запустить сервер разработки Django
- Что выводит runserver при старте
- Порт и адрес сервера
- Доступ из локальной сети: 0.0.0.0 и ALLOWED_HOSTS
- Как поменять порт по умолчанию
- Автоперезагрузка и —noreload
- Многопоточность и —nothreading
- Другие параметры runserver
- Как остановить сервер Django
- Частые ошибки при запуске сервера
- Error: That port is already in use
- Error: You don’t have permission to access that port
- DisallowedHost: Invalid HTTP_HOST header
- You have unapplied migration(s)
- CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False
- can’t open file ‘manage.py’ и Couldn’t import Django
- Почему runserver не для продакшна
- Запуск сервера Django в PyCharm и VS Code
- Частые вопросы
- Как запустить сервер Django по HTTPS?
- Почему изменения в коде не видны после сохранения?
- Можно ли оставить runserver работать в фоне на сервере?
- Как открыть сайт на runserver через туннель вроде ngrok?
- Нужен ли runserver в Docker?
- Итог
Сервер Django для разработки запускается командой python manage.py runserver из папки, где лежит manage.py, при активированном виртуальном окружении. Сайт откроется по адресу http://127.0.0.1:8000/, а остановить сервер можно сочетанием Ctrl+C. Это встроенный сервер для локальной работы: он сам перезапускается при правке кода, но для продакшна не предназначен.
python manage.py runserver
Ниже — порт и адрес, доступ с телефона в той же сети, автоперезагрузка, остановка, разбор частых ошибок и чем заменить runserver на боевом сервере. Команды и вывод проверены на Django 6.1 и 5.2 LTS.
Как запустить сервер разработки Django
Перед запуском нужны три вещи: установленный Django, активированное окружение и проект. Если проекта ещё нет, создайте его командой startproject; если Django не установлен — пройдите установку Django.
Перейдите в папку с manage.py, активируйте виртуальное окружение и запустите сервер.
Windows:
cd C:\projects\mysite
.venv\Scripts\activate
python manage.py migrate
python manage.py runserver
macOS и Linux:
cd ~/projects/mysite
source .venv/bin/activate
python manage.py migrate
python manage.py runserver
После активации окружения команда python указывает на интерпретатор из .venv на всех системах. Без окружения на Windows используйте py manage.py runserver, на macOS и Linux — python3 manage.py runserver. migrate нужен при первом запуске и после новых миграций; сервер стартует и без него, но предупредит о непримененных миграциях.
Что выводит runserver при старте
Вывод Django 6.1 на Windows после migrate:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
October 10, 2026 - 07:24:16
Django version 6.1.2, using settings 'config.settings'
Starting WSGI development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/6.1/howto/deployment/
Что означают строки:
Watching for file changes with StatReloader— включена автоперезагрузка.StatReloaderраз в секунду проверяет время изменения файлов.Performing system checks...иSystem check identified no issues— Django проверил проект на типовые ошибки конфигурации, как командаcheck.Django version ..., using settings 'config.settings'— версия фреймворка и модуль настроек. Если здесь не тот модуль, сервер запущен не из того проекта.Starting WSGI development server at http://127.0.0.1:8000/— адрес, который нужно открыть в браузере. В Django 5.2 LTS строка выглядит какStarting development server at ....Quit the server with CTRL-BREAK.— на Windows подсказка называетCtrl+Break, на macOS и Linux —CONTROL-C.Ctrl+Cработает везде.WARNING: This is a development server...— напоминание, что сервер не для продакшна.
Дальше в терминал пишется журнал запросов: время, метод, путь, код ответа и размер ответа в байтах.
[10/Oct/2026 07:24:20] "GET / HTTP/1.1" 200 12149
Not Found: /nope/
[10/Oct/2026 07:24:20] "GET /nope/ HTTP/1.1" 404 2262
Порт и адрес сервера
По умолчанию сервер слушает 127.0.0.1:8000. Порт или адрес с портом передаются одним аргументом после runserver:
| Команда | Где доступен сервер |
|---|---|
python manage.py runserver | http://127.0.0.1:8000/, только с этого компьютера |
python manage.py runserver 8080 | http://127.0.0.1:8080/ |
python manage.py runserver 0.0.0.0:8000 | все сетевые интерфейсы, в том числе из локальной сети |
python manage.py runserver 192.168.1.35:8000 | только по указанному IP-адресу компьютера |
python manage.py runserver -6 | IPv6-адрес http://[::1]:8000/ |
python manage.py runserver 127.0.0.1:0 | свободный порт, который выберет система |
Можно запустить несколько серверов одновременно — например, два проекта — если у каждого свой порт: runserver 8000 в одном терминале и runserver 8001 в другом.
Доступ из локальной сети: 0.0.0.0 и ALLOWED_HOSTS
Адрес 127.0.0.1 доступен только с того же компьютера. Чтобы открыть сайт с телефона или другого ноутбука в той же сети Wi-Fi, сделайте три шага.
-
Узнайте IP-адрес компьютера в локальной сети: на Windows —
ipconfig(строкаIPv4 Address), на Linux —ip addr, на macOS —ipconfig getifaddr en0. Обычно это адрес вида192.168.x.x. -
Запустите сервер на всех интерфейсах:
python manage.py runserver 0.0.0.0:8000 -
Добавьте IP-адрес в
ALLOWED_HOSTSвsettings.py:# config/settings.py ALLOWED_HOSTS = ['localhost', '127.0.0.1', '192.168.1.35']
Теперь сайт открывается с другого устройства по адресу http://192.168.1.35:8000/.
Третий шаг пропускают чаще всего. Пока ALLOWED_HOSTS пуст и DEBUG = True, Django принимает только localhost, 127.0.0.1 и [::1]. Запрос по IP-адресу получит ответ 400 Bad Request, а в терминале появится:
Invalid HTTP_HOST header: '192.168.1.35:8000'. You may need to add '192.168.1.35' to ALLOWED_HOSTS.
Если IP-адрес меняется, на время разработки можно разрешить любой хост: ALLOWED_HOSTS = ['*']. В продакшне так делать нельзя — там перечисляют реальные домены. Подробнее о настройке — в статье о settings.py в Django.
Важно: на Windows при первом запуске на
0.0.0.0брандмауэр может спросить, разрешить лиpython.exeдоступ к сети. Разрешите доступ для частных сетей, иначе другие устройства не достучатся до сервера. На Linux с включённымufwоткройте порт:sudo ufw allow 8000/tcp.
В документации Django есть сокращение 0 вместо 0.0.0.0: runserver 0:8000. На Linux и macOS оно работает, а на Windows сервер падает после системных проверок с ошибкой Error: [Errno 11001] getaddrinfo failed. На Windows пишите адрес полностью.
Как поменять порт по умолчанию
Отдельной настройки для порта в settings.py нет. Если порт 8000 постоянно занят, самый простой путь — сохранить команду с портом в конфигурации IDE или скрипте. Второй вариант — переопределить команду runserver в своём приложении:
# core/management/commands/runserver.py
from django.contrib.staticfiles.management.commands.runserver import (
Command as StaticfilesRunserverCommand,
)
class Command(StaticfilesRunserverCommand):
default_port = "8080"
В папках core/management/ и core/management/commands/ должны быть пустые файлы __init__.py. Приложение core поставьте в INSTALLED_APPS выше django.contrib.staticfiles: при одинаковых именах команд Django берёт команду из приложения, которое стоит раньше. Если поставить ниже, сервер продолжит стартовать на 8000. Наследование от команды staticfiles сохраняет раздачу статики и параметры --nostatic и --insecure.
Автоперезагрузка и —noreload
Сервер разработки следит за Python-файлами проекта и перезапускается при сохранении любого из них:
C:\projects\mysite\config\urls.py changed, reloading.
Watching for file changes with StatReloader
Performing system checks...
Шаблоны подхватываются без перезапуска. А вот добавление новых файлов перезапуск не вызывает, как и изменение .env или других файлов, которые не импортируются как модули: в этих случаях остановите и запустите сервер заново.
Если в коде оказалась синтаксическая ошибка, например в urls.py или views.py, в терминале появится трейсбек, но процесс наблюдения продолжит работать. Исправьте файл — сервер перезапустится сам. Исключение — ошибка в settings.py, из-за которой Django не может загрузиться при старте: тогда runserver сразу завершается, и после исправления его нужно запустить заново.
На больших проектах опрос файлов раз в секунду заметно нагружает процессор. На Linux и macOS можно поставить службу Watchman и пакет pywatchman: тогда Django получает уведомления об изменениях от операционной системы, и в первой строке вывода будет WatchmanReloader.
Автоперезагрузка работает через два процесса: наблюдатель и дочерний процесс с сервером. Поэтому код верхнего уровня в settings.py выполняется дважды — print() в настройках выведет строку два раза. Параметр --noreload отключает наблюдатель:
python manage.py runserver --noreload
Он нужен, когда:
- вы ставите точку останова
breakpoint()и отлаживаете код в терминале черезpdb; - при старте выполняется код, который не должен запускаться дважды;
- проект лежит в папке с огромным количеством файлов, и наблюдение тормозит.
Без перезагрузчика изменения в коде не применяются, пока вы не перезапустите сервер вручную.
Многопоточность и —nothreading
По умолчанию сервер многопоточный: каждый запрос обрабатывается в отдельном потоке, поэтому медленная страница не блокирует остальные. Параметр --nothreading включает обработку запросов строго по одному:
python manage.py runserver --nothreading
Это полезно, чтобы проверить, не зависит ли ошибка от параллельных запросов, или чтобы журналы и отладчик не перемешивались. При обычной разработке параметр не нужен.
Другие параметры runserver
| Параметр или переменная | Что делает |
|---|---|
--insecure | раздаёт статику при DEBUG = False |
--nostatic | отключает раздачу статики по STATIC_URL |
--skip-checks | пропускает системные проверки при старте |
--settings config.settings_dev | запускает сервер с другим модулем настроек |
--ipv6, -6 | слушает IPv6, адрес по умолчанию ::1 |
DJANGO_RUNSERVER_HIDE_WARNING=true | скрывает предупреждение о продакшне (Django 5.2+) |
При DEBUG = False сервер перестаёт раздавать CSS и JavaScript: админка и сайт открываются без стилей. Так удобно проверять свои страницы ошибок 404 и 500. Чтобы статика при этом загружалась, добавьте --insecure:
python manage.py runserver --insecure
Название параметра напоминает, что в продакшне статику раздают Nginx или WhiteNoise.
Переменная окружения задаётся перед командой:
# macOS и Linux
DJANGO_RUNSERVER_HIDE_WARNING=true python manage.py runserver
# Windows PowerShell
$env:DJANGO_RUNSERVER_HIDE_WARNING = "true"
python manage.py runserver
Как остановить сервер Django
Нажмите Ctrl+C в терминале, где запущен сервер. На Windows также работает Ctrl+Break. Закрытие окна терминала тоже завершает сервер, но если запуск шёл из IDE или фоновой задачи, процесс может остаться и продолжить занимать порт.
Найти такой процесс по порту и остановить его по номеру (PID):
# Windows
netstat -ano | findstr :8000
taskkill /PID 12345 /F
# macOS и Linux
lsof -i :8000
kill 12345
Последнее число в строке netstat и колонка PID в выводе lsof — номер процесса. Завершайте только процесс с нужным PID: команда вроде taskkill /IM python.exe остановит все программы на Python, включая чужие.
Частые ошибки при запуске сервера
Error: That port is already in use
Порт занят другим процессом — часто вторым runserver в соседнем терминале. Остановите его, как описано выше, или запустите сервер на другом порту: python manage.py runserver 8001.
На Windows поведение другое. Второй runserver на том же порту стартует без ошибки, и запросы может обрабатывать старый процесс — отсюда жалобы «правки не применяются». Если порт занят программой другого типа, Windows отказывает в доступе, и вы увидите следующую ошибку.
Error: You don’t have permission to access that port
На Windows это обычно значит, что порт занят другой программой или входит в диапазон, зарезервированный системой. Зарезервированные диапазоны показывает команда netsh interface ipv4 show excludedportrange protocol=tcp. Выберите порт вне этих диапазонов.
На Linux и macOS ошибка появляется при попытке занять порт ниже 1024, например runserver 80: такие порты доступны только суперпользователю. Не запускайте runserver через sudo — используйте порт 8000 или 8080.
DisallowedHost: Invalid HTTP_HOST header
Запрос пришёл на имя или IP-адрес, которого нет в ALLOWED_HOSTS. Браузер показывает Bad Request (400), а в терминале есть подсказка, какой адрес добавить. Добавьте его в список, как в разделе о локальной сети.
You have unapplied migration(s)
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
Сервер при этом работает, но страницы, которые обращаются к базе данных, упадут с ошибкой no such table. Остановите сервер и выполните python manage.py migrate. Как работают миграции и что делать при конфликтах — в статье о миграциях Django.
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False
Вы выключили режим отладки, но не заполнили ALLOWED_HOSTS. Сервер в таком состоянии не стартует. Укажите хотя бы ['127.0.0.1', 'localhost'] или верните DEBUG = True для локальной работы.
can’t open file ‘manage.py’ и Couldn’t import Django
python.exe: can't open file 'C:\\projects\\manage.py': [Errno 2] No such file or directory
Терминал открыт не в той папке. Перейдите командой cd в каталог, где лежит manage.py.
Сообщение ImportError: Couldn't import Django. Are you sure it's installed... значит, что Python не видит Django: окружение не активировано или пакет установлен в другой интерпретатор. Активируйте .venv и проверьте установку командой python -m django --version.
Почему runserver не для продакшна
При каждом запуске Django выводит предупреждение:
WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
В документации Django прямо сказано: сервер разработки не проходил аудит безопасности и тесты производительности, и доработка его под продакшн не входит в задачи проекта. На практике у него нет управления процессами и воркерами, перезапуска после падения, HTTPS и эффективной раздачи статики.
Чем заменить runserver на сервере:
- Gunicorn за Nginx — стандартная схема для WSGI-проектов. Gunicorn запускает несколько процессов с приложением, Nginx принимает соединения, отдаёт статику и терминирует HTTPS. Пошагово — в руководстве по деплою Django с Gunicorn и Nginx.
- Uvicorn — ASGI-сервер для асинхронных представлений и WebSocket:
uvicorn config.asgi:application. Подробнее — в статье об Uvicorn. - Docker — те же Gunicorn или Uvicorn внутри контейнера, см. Django в Docker.
Gunicorn не работает на Windows: на этой системе для разработки используют runserver, а боевой сервер разворачивают на Linux, в WSL или в Docker. Uvicorn на Windows запускается, но статику сам не раздаёт — админка через него откроется без стилей.
runserver всегда работает по WSGI. Если проекту нужен ASGI уже в разработке, например для Django Channels, пакет Daphne подменяет команду runserver на свою ASGI-версию.
Запуск сервера Django в PyCharm и VS Code
Во встроенном терминале любой IDE работает обычная команда python manage.py runserver — главное, чтобы в редакторе был выбран интерпретатор из .venv. Конфигурация запуска нужна для отладчика и запуска одной кнопкой.
VS Code. На панели Run and Debug нажмите create a launch.json file и выберите шаблон Django. Получится конфигурация:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Django",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": ["runserver"],
"django": true,
"justMyCode": true
}
]
}
Порт или адрес добавьте в args: ["runserver", "8080"]. Флаг "django": true включает точки останова в шаблонах. Подробнее о настройке редактора — в статье о VS Code для Python.
PyCharm. В PyCharm Pro есть готовая конфигурация: Run → Edit Configurations → «+» → Django Server. В ней задаются Host, Port, дополнительные параметры и флажок No reload (то же, что --noreload). Без поддержки Django создайте обычную конфигурацию Python: скрипт — manage.py, параметры — runserver, рабочая папка — корень проекта.
Частые вопросы
Как запустить сервер Django по HTTPS?
runserver работает только по HTTP. Для локальной проверки HTTPS подойдёт runserver_plus из пакета django-extensions: команда python manage.py runserver_plus --cert-file cert.crt сама создаст самоподписанный сертификат. Нужны пакеты Werkzeug и pyOpenSSL, а приложение django_extensions добавляют в INSTALLED_APPS. На боевом сервере HTTPS настраивают в Nginx.
Почему изменения в коде не видны после сохранения?
Проверьте три вещи: запущен ли сервер с автоперезагрузкой (без --noreload), не работает ли на этом же порту второй, старый сервер (на Windows это частая причина) и не изменили ли вы файл, который не отслеживается, например .env. В последнем случае перезапустите сервер. Если в браузере не обновляются CSS и JavaScript, обновите страницу без кеша: Ctrl+F5 или Cmd+Shift+R.
Можно ли оставить runserver работать в фоне на сервере?
Технически да, например через nohup, но такой сайт упадёт при первой ошибке процесса и не переживёт перезагрузку сервера. Для постоянной работы используют Gunicorn или Uvicorn под управлением systemd или в Docker-контейнере с политикой перезапуска.
Как открыть сайт на runserver через туннель вроде ngrok?
Запустите сервер как обычно и направьте туннель на порт 8000. Домен туннеля добавьте в ALLOWED_HOSTS, а его адрес с https:// — в CSRF_TRUSTED_ORIGINS, иначе отправка форм и вход в админку завершатся ошибкой CSRF. Сам туннель шифрует трафик, поэтому runserver остаётся на HTTP.
Нужен ли runserver в Docker?
Для разработки — да: в контейнере сервер запускают командой python manage.py runserver 0.0.0.0:8000. Адрес 0.0.0.0 обязателен, иначе сервер будет недоступен снаружи контейнера. В продакшн-образе вместо него запускают Gunicorn.
Итог
Чтобы запустить сервер Django, активируйте окружение, перейдите в папку с manage.py и выполните python manage.py runserver — сайт откроется на http://127.0.0.1:8000/. Для доступа из локальной сети используйте runserver 0.0.0.0:8000 и добавьте IP-адрес в ALLOWED_HOSTS. --noreload пригодится для отладки, --insecure — для проверки страниц с DEBUG = False. Останавливайте сервер через Ctrl+C, а на боевом сервере вместо runserver используйте Gunicorn или Uvicorn за Nginx.
- #Django
- #runserver
- #manage.py
- #Сервер разработки
- #ALLOWED_HOSTS