{{ request.get_host }}
должен защищать от атак заголовка HTTP-хоста при использовании вместе со значением ALLOWED_HOSTS
(добавлено в Django 1.4.4).
Обратите внимание, что {{ request.META.HTTP_HOST }}
не имеет такой же защиты. См. документы :
allowed_hosts
Список строк, представляющих имена хостов / доменов, которые может обслуживать этот сайт Django. Это мера безопасности для предотвращения атак заголовка HTTP-хоста , которые возможны даже при многих, казалось бы, безопасных конфигурациях веб-сервера.
... Если заголовок Host
(или X-Forwarded-Host
, если USE_X_FORWARDED_HOST
включен) не соответствует ни одному значению в этом списке, метод django.http.HttpRequest.get_host()
вызовет SuspiciousOperation
.
... Эта проверка применяется только через get_host()
; если ваш код обращается к заголовку хоста напрямую с request.META
, вы обходите эту защиту.
Что касается использования request
в вашем шаблоне, то вызовы функций рендеринга шаблона изменились в в Django 1.8 , поэтому вам больше не нужно обрабатывать RequestContext
напрямую.
Вот как отрисовать шаблон для вида, используя функцию быстрого доступа render()
:
from django.shortcuts import render
def my_view(request):
...
return render(request, 'my_template.html', context)
Вот как вывести шаблон для электронного письма, в котором IMO является наиболее распространенным случаем, когда вы хотите указать значение хоста:
from django.template.loader import render_to_string
def my_view(request):
...
email_body = render_to_string(
'my_template.txt', context, request=request)
Вот пример добавления полного URL в шаблон электронной почты; request.scheme должно получить http
или https
в зависимости от того, что вы используете:
Thanks for registering! Here's your activation link:
{{ request.scheme }}://{{ request.get_host }}{% url 'registration_activate' activation_key %}