Получение доменного имени в Django template: решение
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы извлечь доменное имя сайта в Django из шаблона, примените {{ request.get_host }}
. Также не забудьте убедиться, что переменная request
включена в текущий контекст через RequestContext
:
{{ request.get_host }}
Работа с несколькими доменами и contrib.sites
Управление несколькими сайтами становится проще при использовании фреймворка 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 }}
не срабатывает — возможно, причина в его отсутствии.