【问题标题】:Accessing "request" object within Jinja2 "environment" function在 Jinja2“环境”功能中访问“请求”对象
【发布时间】:2021-01-13 22:50:23
【问题描述】:

我目前正在处理一个大量使用 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 并不那么容易。

【问题讨论】:

    标签: django jinja2


    【解决方案1】:

    您可以访问全局变量的请求,如 Django 模板 Jinja2 documentation 中所述

    有意将默认配置保持在最低限度。 如果一个 模板通过请求渲染(例如,使用 render() 时), Jinja2 后端将全局请求、csrf_input 和 csrf_token 添加到 除此之外,此后端不会创建 Django 风格的环境。它不知道 Django 过滤器和 标签。为了使用 Django 特定的 API,您必须配置它们 进入环境

    【讨论】:

    • 好吧,我仍然不知道如何访问request。我正在尝试env.globals.request,但没有成功。
    • 应该仍然只是 request 而不是记录的环境的一部分
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多