Получение доменного имени в Django template: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

django
Скопировать код
{{ request.get_host }}
Кинга Идем в IT: пошаговый план для смены профессии

Работа с несколькими доменами и contrib.sites

Управление несколькими сайтами становится проще при использовании фреймворка contrib.sites в Django.

Настройка contrib.sites

  1. В INSTALLED_APPS добавьте 'django.contrib.sites'.
  2. Для каждого сайта в settings.py укажите уникальный SITE_ID.
  3. Получить информацию о текущем сайте можно с помощью Site.objects.get_current() в представлениях. Это расширяет возможности работы с сайтами.

Преимущества становятся особенно очевидными, когда требуется частое обращение к текущему сайту в шаблонах. В этом случае на помощь приходит процессор контекста.

Создание процессора контекста

Создайте переменную {{ SITE_URL }}, доступную во всех шаблонах:

Python
Скопировать код
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:

Python
Скопировать код
# Приведем пример как получить доменное имя
domain = Site.objects.get_current().domain

Если же необходимы более детальные данные о URL, например, при работе с поддоменами или четко определенными маршрутами, конструкция будет выглядеть следующим образом:

Python
Скопировать код
# Извлекаем базовый 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:

Python
Скопировать код
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 }} не срабатывает — возможно, причина в его отсутствии.

Полезные материалы