Получение доменного имени в Django template: решение
Быстрый ответ
Чтобы извлечь доменное имя сайта в Django из шаблона, примените {{ request.get_host }}. Также не забудьте убедиться, что переменная request включена в текущий контекст через RequestContext:
{{ request.get_host }}

Работа с несколькими доменами и
Управление несколькими сайтами становится проще при использовании фреймворка contrib.sites в Django.
Настройка contrib.sites
- В
INSTALLED_APPSдобавьте'django.contrib.sites'. - Для каждого сайта в
settings.pyукажите уникальныйSITE_ID. - Получить информацию о текущем сайте можно с помощью
Site.objects.get_current()в представлениях. Это расширяет возможности работы с сайтами.
Преимущества становятся особенно очевидными, когда требуется частое обращение к текущему сайту в шаблонах. В этом случае на помощь приходит процессор контекста.
Создание процессора контекста
Создайте переменную {{ SITE_URL }}, доступную во всех шаблонах:
from django.contrib.sites.models import Site
def global_site_url(request):
return {'SITE_URL': Site.objects.get_current().domain}
Не забывайте подключить созданный процессор в TEMPLATE_CONTEXT_PROCESSORS. После этого {{ SITE_URL }} готов к использованию.
Получение доменного имени с помощью Python кода
В представлениях или мидлварах первой строкой следует извлечь доменное имя сайта используя Site.objects.get_current().domain:
# Приведем пример как получить доменное имя
domain = Site.objects.get_current().domain
Если же необходимы более детальные данные о URL, например, при работе с поддоменами или четко определенными маршрутами, конструкция будет выглядеть следующим образом:
# Извлекаем базовый URL без последнего слеша
full_url = request.build_absolute_uri('/')[:-1]
Визуализация
Вообразите процесс получения домена как обращение к почтовому голубю (request.get_host) с просьбой принести адрес ({{ request.get_host }}) нашего убежища (домен сайта).
Продвинутый раздел: для тех, кому требуется больше информации
В первую очередь – безопасность
Не забывайте о потенциальной угрозе: {{ request.get_host }} опирается на HTTP-заголовки, которые могут быть подменены. Более безопасным решением будет основываться на проверенных данных из модели Site или настройках.
Управление поддоменами
Если требуется управлять поддоменами, использование процессора контекста с анализом request.get_host может быть крайне полезным в решении этой задачи.
Многофункциональность RequestContext
RequestContext позволяет передать request в шаблоны, что делает данный объект полезным инструментом в Django:
from django.template import RequestContext
def my_view(request):
# Пример функции представления
return render(request, 'my_template.html', context, context_instance=RequestContext(request))
Заключение
Не забывайте использовать функцию render(), благодаря которой не придется вручную добавлять RequestContext. Если {{ request.get_host }} не срабатывает — возможно, причина в его отсутствии.


