Доступ к объекту «request» в функции Jinja2 «environment»

#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 , а не частью среды, как задокументировано