如何在没有 Django 其余部分的情况下使用 Django 模板?
-
01-07-2019 - |
题
我想在我的 (Python) 代码中使用 Django 模板引擎,但我没有构建基于 Django 的网站。如果没有 settings.py 文件(和其他文件)并且必须设置 DJANGO_SETTINGS_MODULE 环境变量,如何使用它?
如果我运行以下代码:
>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
我得到:
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
解决方案
解决方案很简单。其实是 有据可查, ,但不太容易找到。(我不得不四处挖掘——当我尝试了几个不同的谷歌搜索时,它没有出现。)
以下代码有效:
>>> from django.template import Template, Context
>>> from django.conf import settings
>>> settings.configure()
>>> t = Template('My name is {{ my_name }}.')
>>> c = Context({'my_name': 'Daryl Spitzer'})
>>> t.render(c)
u'My name is Daryl Spitzer.'
有关您可能想要定义的一些设置(作为配置的关键字参数)的描述,请参阅 Django 文档(上面链接)。
其他提示
金贾2 句法 与 Django 几乎相同,几乎没有什么区别,并且您将获得更强大的模板引擎,它还将您的模板编译为字节码(快速!)。
我用它来做模板,包括 Django 本身,它非常好。如果缺少某些您想要的功能,您还可以轻松编写扩展。
这是代码生成的一些演示:
>>> import jinja2
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True)
from __future__ import division
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join
name = None
def root(context, environment=environment):
l_data = context.resolve('data')
t_1 = environment.filters['upper']
if 0: yield None
for l_row in l_data:
if 0: yield None
yield unicode(t_1(environment.getattr(l_row, 'name')))
blocks = {}
debug_info = '1=9'
您想使用 Django 模板有什么特殊原因吗?两个都 金贾 和 源氏 在我看来,是优越的。
如果你真的想的话,那就看看 Django 文档 settings.py
. 。特别是“使用设置而不设置 DJANGO_SETTINGS_MODULE
”。使用这样的东西:
from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
我还推荐jinja2。有一个 好文章 在 django
与 jinja2
这提供了一些关于为什么您应该选择后者的详细信息。
根据 Jinja 文档, Python 3 支持仍处于实验阶段. 。因此,如果您使用的是 Python 3 并且性能不是问题,您可以使用 django 的内置模板引擎。
Django 1.8 引入了对 多个模板引擎 这需要更改模板的初始化方式。您必须显式配置 settings.DEBUG
这是django提供的默认模板引擎使用的。这是使用模板而不使用 django 其余部分的代码。
from django.template import Template, Context
from django.template.engine import Engine
from django.conf import settings
settings.configure(DEBUG=False)
template_string = "Hello {{ name }}"
template = Template(template_string, engine=Engine())
context = Context({"name": "world"})
output = template.render(context) #"hello world"
感谢各位的帮助。这里还有一项补充。您需要使用自定义模板标签的情况。
假设模块 read.py 中有这个重要的模板标签
from django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
这是 html 模板文件“temp.html”:
{{var|bracewrap}}
最后,这是一个将所有内容结合在一起的 Python 脚本
import django
from django.conf import settings
from django.template import Template, Context
import os
#load your tags
from django.template.loader import get_template
django.template.base.add_to_builtins("read")
# You need to configure Django a bit
settings.configure(
TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)), ),
)
#or it could be in python
#t = Template('My name is {{ my_name }}.')
c = Context({'var': 'stackoverflow.com rox'})
template = get_template("temp.html")
# Prepare context ....
print template.render(c)
输出将是
{stackoverflow.com rox}
不。使用 字符串模板 相反,一旦您了解了它,就没有理由考虑任何其他模板引擎。
除了其他人写的之外,如果你想在 Django > 1.7 上使用 Django 模板,你必须给你的 settings.configure(...) 调用 TEMPLATES 变量并调用 django.setup() ,如下所示:
from django.conf import settings
settings.configure(TEMPLATES=[
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['.'], # if you want the templates from a file
'APP_DIRS': False, # we have no apps
},
])
import django
django.setup()
然后您可以像平常一样从字符串加载模板:
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Rob'})
t.render(c)
如果您从磁盘在 .configure 中写入 DIRS 变量:
from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
我赞同上述说法。Jinja 2 是一个非常好的通用 Django 模板超集。我认为他们正在努力让 Django 模板与 settings.py 的耦合程度降低一些,但 Jinja 应该会为您提供良好的帮助。
运行时 manage.py
壳:
>>> from django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
谷歌 AppEngine
使用 Django 模板引擎,你看过他们是怎么做的吗?你也许可以用它。