Как получить доменное имя моего текущего сайта из шаблона Django? Я пытался посмотреть в тег и фильтры, но ничего там.
python
django
django-templates
Жан-Франсуа Фабр
источник
источник
request.META['HTTP_HOST']
дает вам домен. В шаблоне это было бы{{ request.META.HTTP_HOST }}
.Host:
заголовок и получает ответ с поддельным доменом где-то на странице, как это создает дыру в безопасности? Я не понимаю, чем это отличается от того, что пользователь берет сгенерированный HTML и модифицирует себя перед тем, как передать его в свой собственный браузер.Если вам нужен фактический заголовок HTTP Host, см. Комментарий Даниэля Роземана к ответу @ Phsiao. Другой вариант - если вы используете платформу contrib.sites , вы можете установить каноническое доменное имя для сайта в базе данных (сопоставление домена запроса с файлом настроек с правильным SITE_ID - это то, что вы должны сделать самостоятельно через свой настройка веб-сервера). В этом случае вы ищете:
вам нужно будет поместить объект current_site в контекст шаблона самостоятельно, если вы хотите его использовать. Если вы используете его повсеместно, вы можете упаковать его в процессор контекста шаблона.
источник
SITE_ID
настройки соответствуютid
атрибуту текущего сайта в приложении «Сайты» (вы можете найти егоid
в админ-панели «Сайты»). Когда вы звонитеget_current
, Django берет вашSITE_ID
и возвращаетSite
объект с этим идентификатором из базы данных.print("get_current_site: ", get_current_site(request)) print("absolute uri: ", request.build_absolute_uri()) print("HTTP_HOST: ", request.META['HTTP_HOST']) get_current_site: localhost:8001 absolute uri: http://localhost:8001/... HTTP_HOST: localhost:8001
Я открыл
{{ request.get_host }}
метод.источник
HTTP_X_FORWARDED_HOST
заголовок HTTP.request.build_absolute_uri
( docs.djangoproject.com/en/dev/ref/request-response/… )В дополнение к Карлу Мейеру, вы можете создать контекстный процессор, например так:
module.context_processors.py
local settings.py
settings.py
шаблоны, возвращающие экземпляр контекста, URL-адрес сайта {{SITE_URL}}
Вы можете написать свою собственную рутину, если хотите обрабатывать субдомены или SSL в контекстном процессоре.
источник
Вариант контекстного процессора, который я использую:
SimpleLazyObject
Обертка убеждается вызов DB происходит только тогда , когда шаблон фактически используетsite
объект. Это удаляет запрос со страниц администратора. Это также кеширует результат.и включите его в настройках:
В шаблоне вы можете использовать
{{ site.domain }}
для получения текущего доменного имени.edit: для поддержки переключения протокола тоже используйте:
источник
SimpleLazyObject
здесь, потому что лямбда не будет вызываться, если в любом случае ничто не заходит на сайт.SimpleLazyObject
, каждыйRequestContext
будет вызыватьget_current_site()
, и, следовательно, выполнить запрос SQL. Оболочка гарантирует, что переменная оценивается только тогда, когда она фактически используется в шаблоне.SimpleLazyObject
сделано для того, чтобы избежать переоценки функции, которая на самом деле не нужна, посколькуSite
объект кэшируется.from django.contrib.sites.shortcuts import get_current_site
Я знаю, что этот вопрос старый, но я наткнулся на него в поисках питонского способа получения текущего домена.
источник
build_absolute_uri
задокументировано здесь .Быстро и просто, но не подходит для производства:
(в представлении)
(в шаблоне)
Обязательно используйте RequestContext , который имеет место, если вы используете render .
Не доверяйте
request.META['HTTP_HOST']
производству: эта информация поступает из браузера. Вместо этого используйте ответ @ CarlMeyerисточник
request.scheme
. Возможно, доступно только в новых версиях Django.request.scheme
был добавлен в Django 1.7.{{ request.get_host }}
должен защищать от атак заголовка HTTP-хоста при использовании вместе сALLOWED_HOSTS
настройкой (добавлено в Django 1.4.4).Обратите внимание, что
{{ request.META.HTTP_HOST }}
не имеет такой же защиты. Смотрите документы :Что касается использования
request
в вашем шаблоне, вызовы функции рендеринга шаблонов изменились в Django 1.8 , поэтому вам больше не нужно обрабатыватьRequestContext
напрямую.Вот как сделать шаблон для представления, используя функцию ярлыка
render()
:Вот как вывести шаблон для электронного письма, в котором IMO является наиболее распространенным случаем, когда вы хотите указать значение хоста:
Вот пример добавления полного URL в шаблон электронной почты; request.scheme должен получить
http
или вhttps
зависимости от того, что вы используете:источник
Я использую пользовательский тег шаблона. Добавить к например
<your_app>/templatetags/site.py
:Используйте его в таком шаблоне:
источник
get_current
это документированный метод: docs.djangoproject.com/en/dev/ref/contrib/sites/…'http://%s'
может быть проблема в случаеhttps
подключения; Схема не является динамической в этом случае.Подобно ответу пользователя panchicore, это то, что я сделал на очень простом веб-сайте. Он предоставляет несколько переменных и делает их доступными в шаблоне.
SITE_URL
будет содержать значение likeexample.com
SITE_PROTOCOL
будет содержать значение likehttp
илиhttps
SITE_PROTOCOL_URL
будет содержать значение likehttp://example.com
илиhttps://example.com
SITE_PROTOCOL_RELATIVE_URL
будет содержать значение like//example.com
.модуль / context_processors.py
settings.py
Затем на шаблонах, использовать их как
{{ SITE_URL }}
,{{ SITE_PROTOCOL }}
,{{ SITE_PROTOCOL_URL }}
и{{ SITE_PROTOCOL_RELATIVE_URL }}
источник
В шаблоне Django вы можете сделать:
источник
django.template.context_processors.request
также [это руководство помогло] ( simpleisbetterthancomplex.com/tips/2016/07/20/… )Если вы используете обработчик контекста «запрос» и используете платформу сайтов Django , и у вас установлено промежуточное программное обеспечение сайта (т.е. ваши настройки включают это):
... тогда у вас будет
request
объект, доступный в шаблонах, и он будет содержать ссылку на текущийSite
для запроса какrequest.site
. Затем вы можете получить домен в шаблоне с помощью:источник
Как насчет этого подхода? Работает для меня. Он также используется в django-регистрации .
источник
localhost
вы получитеhttps
схему (она считается безопасной), которая не будет работать, если у вас есть статический URL (толькоhttp://127.0.0.1
действительный, а неhttps://127.0.0.1
). Так что это не идеально, когда все еще в разработке.источник
Вы можете использовать
{{ protocol }}://{{ domain }}
в своих шаблонах, чтобы получить доменное имя.источник