Получение URL в шаблонах Django: request.path vs path_info vs get_full_path vs build_absolute_uri
В шаблонах Django часто требуется знать текущий URL.
- Навигация «активировать текущий пункт меню»
- После входа в систему «вернуться к ранее просматриваемой странице (next)»
- Создание канонического URL / ссылки для совместного использования
- Создание ссылки «на текущую страницу с сохранением строк запроса»
Однако помимо {{ request.path }} существует несколько похожих вариантов, что может сбивать с толку. Сегодня мы разберём только четыре наиболее часто используемых.
request.pathrequest.path_inforequest.get_full_path()request.build_absolute_uri()
Откуда берётся {{ request }}
Появление {{ request }} в шаблоне обычно означает, что включён контекстный процессор запросов.
django.template.context_processors.requestдобавляет объектrequestв контекст шаблона.- Этот процессор активируется, когда он зарегистрирован в
TEMPLATES→OPTIONS['context_processors'].
То есть Django по умолчанию добавляет request в глобальный контекст, если пользователь не удалит эту настройку. Поэтому большинство разработчиков используют request без лишних усилий.
Сам объект request создаётся Django при получении HTTP‑запроса (на самом деле это подкласс HttpRequest для WSGI/ASGI) и передаётся в представление. В нём находятся атрибуты path, path_info и другие.

Быстрый вывод: как запомнить 4 варианта
path: «только путь без домена»path_info: «реальный путь, видимый приложением (без префикса скрипта)»get_full_path(): «path+ строка запроса»build_absolute_uri(): «полный URL с схемой и хостом»
Теперь разберём каждый из них подробнее.
1) request.path: путь без домена
request.path возвращает только путь запроса, без схемы и хоста. Пример:
/music/bands/the_beatles/
Когда это удобно
- Простое сравнение для активации меню
django
{% if request.path == "/settings/" %}active{% endif %}
* Определение категории по префиксу
django
{% if request.path|slice:":5" == "/api/" %}...{% endif %}
2) request.path_info: путь, устойчивый к разным средам развертывания
Ключевой момент из документации Django:
- В некоторых конфигурациях URL‑путь разделяется на префикс скрипта (SCRIPT_NAME) и path info.
path_infoвсегда содержит именно часть path info, поэтому менее зависит от окружения.
То есть, если приложение монтируется под /app (через обратный прокси, субпуть и т.д.), path и path_info могут отличаться.
Когда это удобно
- При развертывании под субпутём (например,
/app/) и необходимости сравнивать «путь приложения». - При тестировании и продакшене, где префикс может отличаться.
Если приложение работает только под корневым доменом (
/),pathиpath_infoсовпадают, и разница не заметна. При смене окружения разница становится важной.
3) request.get_full_path(): путь + строка запроса
get_full_path() возвращает path с добавленной строкой запроса. Пример:
/music/bands/the_beatles/?print=true
Когда это удобно
- Создание ссылки «на текущую страницу с сохранением параметров»
django
<a href="{{ request.get_full_path }}">Ссылка на обновление</a>
* При проверке прав доступа и возврате пользователя на исходную страницу
django
<a href="/login/?next={{ request.get_full_path|urlencode }}">Вход</a>
В Django есть также
get_full_path_info(), который основан наpath_info. Это не рассматриваем в данном сравнении, но полезно знать.
4) request.build_absolute_uri(): полный URL с схемой и хостом
build_absolute_uri() формирует абсолютный URL на основе текущего запроса.
Пример:
https://example.com/music/bands/the_beatles/?print=true
Когда это удобно
- При отправке ссылок в письмах или мессенджерах, где нужен полный URL.
- Для мета‑тегов
canonical,og:urlи т.п. - При передаче callback‑URL внешним системам.
Что нужно учитывать
build_absolute_uri() использует информацию о хосте из запроса (get_host()). Это не обязательно совпадает с реальным URL в браузере. Если Nginx работает как обратный прокси или в Django реализована логика, меняющая хост, результат может отличаться от ожидаемого. Поэтому при работе с доменами важно проверять настройки развертывания.
Итоги и резюме
- Активация меню в шаблоне →
request.path - Стабильное сравнение в субпутевых/прокси‑окружениях →
request.path_info - Включение строки запроса →
request.get_full_path() - Полный внешний URL →
request.build_absolute_uri()
Смотрите также: