Вступление
В зависимости от того, где и для чего, запускать django-сервер можно по-разному. Так, например, мы не будем запускать сервер django напрямую если деплоим сайт на хостинг или VPS.
Или, например, чтобы можно было проверить работу сервера в максимально приближенных условиях, как при разворачивании на реальном сервере (DEBUG=False) + (ALLOWED_HOSTS=("localhost",)), необходимо использовать совершенно другие техники для запуска сервера.
В этой статье я и расскажу как можно запускать django-сервер, различными способами.
Обычный запуск сервера, для разработки
Это такой запуск сервера django при котором он и обслуживает статические файлы, и отвечает на запросы от браузера. По умолчанию всё это он делает через 8000 порт и выглядит эта команда так:
Есть лишь один позиционный аргумент, номер порта. Его можно указать сразу после runserver:
Таким образом, наш сервер будет обрабатывать только те запросы, которые идут на 7000 порт и на локальный адрес - http://localhost:7000.
Если django-проект сделан и настроен правильно, но ещё без собственных обработчиков представлений, то ты должен увидеть что-то вроде этого:

Или это, если уже есть собственные представления и маршрутизация, плюс правильно настроенные STATIC_URL и MEDIA_URL:

Суть в том, что вся статика успешно была получена.
Запуск сервера для проверки готовности деплоя на сервере
Что я под этим подразумеваю. Представь себе такую ситуацию, ты хочешь добавить и настроить собственные обработчики и шаблоны для страниц 404 и 500. Но, мы все знаем какие страницы мы получим, если у нас случилась ошибка на сервере или страница не была найдена:

И когда мы переведём сервер в боевое положение т.е. DEBUG=False плюс ALLOWED_HOSTS=("*") мы получим страницу, которую мы конечно предварительно настроили для показа 404 и 500 ошибки, но без стилей и скриптов. Вот что будет в консоли разработчика:

В документации сказано, что при переходе на боевой режим сервера, django перестаёт обрабатывать и возвращать статику. И правильно, это работа для web-сервера по типу Apache или Nginx.
Чтобы запущенный django-сервер продолжал обрабатывать статику необходимо запускать сервер так:
Теперь можно разрабатывать собственные 400 и 500 страницы без необходимости заводить настоящий сервер :)
Запуск django-сервера на виртуальном хостинге
Для работы на настоящих веб серверах, джанго не нужно запускать вручную. Для этого любое джанго-приложение поддерживает специальные интерфейсы для работы с ними. Это соответственно:
Настройка Django-приложений для веб-серверов может отличаться друг от друга, в зависимости от самого хостинга, но зачастую wsgi.py будет выглядеть, примерно вот так:
Запуск django-сервера на VPS
Для того чтобы запустить django-сервер на VPS, потребуется предварительно настроить веб-сервер как Apache или Nginx чтобы они могли обрабатывать запросы к серверу на определённый порт:
Пример настройки nginx-сервера для HTTP протокола
Или, что более рекомендуемо, использовать 443 порт, мы живём в 2025 году в конце то концов:
Плюс перманентный редирект с 80 порта:
После чего, необходимо эти запросы передавать в твоё джанго приложение. Для этого оно должно быть запущенно. Плюс ещё должно быть что-то, что могло бы связать веб-сервера(Apache, Nginx) c твоим приложением. Их ещё называют шлюзы веб серверов, так например, ими являются Phusion Passenger и Gunicorn.
Так как сервер может время от времени перезагружаться, то создают соответствующий демон/сервис загрузки при запуске/перезагрузки сервера:
Данный скрипт имеет подстановочные переменные HOST_PLACE_SETUP И USER_PLACE_SETUP.
Это пример, который связывает веб-сервер Nginx и Django-приложение через Gunicorn используя сокеты unix.
Заключение
В этой статье мы рассмотрели, 4 возможных способа запуска django сервера.
- В первом случае обычный запуск для разработки.
- Во втором, запуск боевого сервера с поддержкой статических файлов, всё для той же разработки.
- В третьем случае обозрели совершенно другой подход в запуске django сервера, через WSGI и ASGI интерфейсы.
- Ну и в четвёртом способе, как сделать всё то же самое только с большим контролем и использованием обратных прокси.
Если я упустил некий особый кейс или случай, который мог бы дополнить данную статью буду рад комментам и вашим предложениям. ( ̄︶ ̄)↗