#django #jinja2
#django #jinja2
Вопрос:
В настоящее время я работаю над проектом, в котором активно используется Jinja2 для рендеринга шаблонов. Соответствующий код выглядит следующим образом:
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'request/templates'),
os.path.join(BASE_DIR, 'core/templates'),
os.path.join(BASE_DIR, 'vaux/templates')],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'myapp.jinja2.environment',
'extensions': ['jinja2.ext.i18n', 'jinja2.ext.do', 'vcom.jinja2.blockcache', 'jinja2.ext.with_'],
'autoescape': False,
'bytecode_cache': FileSystemBytecodeCache(CACHE_DIR),
'auto_reload': True,
'lstrip_blocks': True,
'trim_blocks': True,
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages'
],
},
},
]
myapp/jinja2.py файл выглядит следующим образом:
def environment(**options):
env = Environment(**options)
env.globals.update({
'some_global_context_var': 'Some value'
})
# how do I access request ? So that I can write something like request.META['HTTP_HOST']
Итак, моя цель сейчас — попытаться получить доступ к request
объекту, чтобы я мог написать что-то вроде request.META[‘HTTP_HOST’] . Есть ли какой-нибудь способ сделать это?
До этого я пытался создать глобальную контекстную переменную, используя концепцию ванильных «контекстных процессоров» Django, но с Jinja2 это не так просто.
Ответ №1:
Вы можете получить доступ к запросу из глобальных файлов, как описано в документации Django templates Jinja2
Конфигурация по умолчанию целенаправленно сведена к минимуму. Если шаблон отображается с запросом (например, при использовании render()), серверная часть Jinja2 добавляет глобальный запрос, csrf_input и csrf_token в контекст.Кроме того, этот серверный сервер не создает среду с поддержкой Django. Он не знает о фильтрах и тегах Django. Чтобы использовать API, специфичные для Django, вы должны настроить их в среде
Комментарии:
1. Ну, я все еще не могу понять, как получить доступ к
request
. Яenv.globals.request
безуспешно пытаюсь.2. все равно должно быть просто
request
, а не частью среды, как задокументировано