Django-Admin.ru

Как запустить сервер Django: команда runserver

Как запустить сервер Django командой python manage.py runserver: порт и адрес, доступ из локальной сети, автоперезагрузка, остановка и частые ошибки.

Редакция Django-Admin.ru
· 14 мин чтения

Содержание · 11 разделов
  1. Как запустить сервер разработки Django
  2. Что выводит runserver при старте
  3. Порт и адрес сервера
  4. Доступ из локальной сети: 0.0.0.0 и ALLOWED_HOSTS
  5. Как поменять порт по умолчанию
  6. Автоперезагрузка и —noreload
  7. Многопоточность и —nothreading
  8. Другие параметры runserver
  9. Как остановить сервер Django
  10. Частые ошибки при запуске сервера
  11. Error: That port is already in use
  12. Error: You don’t have permission to access that port
  13. DisallowedHost: Invalid HTTP_HOST header
  14. You have unapplied migration(s)
  15. CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False
  16. can’t open file ‘manage.py’ и Couldn’t import Django
  17. Почему runserver не для продакшна
  18. Запуск сервера Django в PyCharm и VS Code
  19. Частые вопросы
  20. Как запустить сервер Django по HTTPS?
  21. Почему изменения в коде не видны после сохранения?
  22. Можно ли оставить runserver работать в фоне на сервере?
  23. Как открыть сайт на runserver через туннель вроде ngrok?
  24. Нужен ли runserver в Docker?
  25. Итог

Сервер 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 runserverhttp://127.0.0.1:8000/, только с этого компьютера
python manage.py runserver 8080http://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 -6IPv6-адрес 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, сделайте три шага.

  1. Узнайте IP-адрес компьютера в локальной сети: на Windows — ipconfig (строка IPv4 Address), на Linux — ip addr, на macOS — ipconfig getifaddr en0. Обычно это адрес вида 192.168.x.x.

  2. Запустите сервер на всех интерфейсах:

    python manage.py runserver 0.0.0.0:8000
  3. Добавьте 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
↑ ↓ выборEnter открытьEsc закрыть