django - 在 Jinja2“环境”功能中访问“请求”对象
问题描述
我目前正在开发一个大量使用 Jinja2 进行模板渲染的项目。相关代码如下所示:
设置.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文档中所述
默认配置有目的地保持在最低限度。如果模板是通过请求渲染的(例如,使用 render() 时),Jinja2 后端会将全局请求、csrf_input 和 csrf_token 添加到上下文中。除此之外,此后端不会创建 Django 风格的环境。它不知道 Django 过滤器和标签。为了使用 Django 特定的 API,您必须将它们配置到环境中
推荐阅读
- python - 如何从 Django 中的外键模型中获取属性?
- sql - 为什么我的串联不允许我在末尾附加 % ?
- python - 从 android/ios 应用程序到 Windows 软件的实时 JSON 字符串传输
- r - 在 R 中使用带有条件的 sample()
- c# - ALTER TABLE ALTER COLUMN ObjID 失败,因为一个或多个对象访问此列
- .net - 如何在实体框架中将视图检索为 int
- ios - 如果我们在并发队列中导致死锁会发生什么?
- python - Colab 找不到文件
- python - 更改数据集中组的各个列值
- mongodb - 如何查询:数组不包含(不区分大小写)元素