我如何在没有Django其余部分的情况下使用Django模板?
我想在我的(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.
解决方案
我们要使用Django模板的任何特殊原因?在我看来,Jinja和Genshi都比较出色。
如果确实需要,请参阅settings.py
上的Django文档。尤其是"使用设置而不设置DJANGO_SETTINGS_MODULE
"部分。使用这样的东西:
from django.conf import settings settings.configure (FOO='bar') # Your settings go here
GoogleAppEngine
使用Django模板引擎,我们是否看过它们的工作方式?我们可以使用它。
发现了这一点:
http://snippets.dzone.com/posts/show/3339
解决方案很简单。它实际上有据可查,但不太容易找到。 (我不得不四处研究-当我尝试了几种其他的Google搜索时,它并没有出现。)
以下代码有效:
>>> 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文档)(作为要配置的关键字参数),请参见。
Jinja2语法与Django几乎相同,只是差别很小,而且我们获得了功能更强大的模板引擎,该引擎还将模板编译为字节码(FAST!)。
我使用它来进行模板化,包括在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'
我回应以上陈述。 Jinja 2是通用模板的一个很好的Django模板超集。我认为他们正在努力使Django模板与settings.py的耦合度降低一些,但是Jinja应该为我们做的更好。
我还建议jinja2. 有一篇关于django和jinja2的不错的文章,其中提供了一些详细的信息,说明了为什么我们更喜欢后者。
别。改用StringTemplate-一旦知道了,就没有理由考虑其他模板引擎了。
我也想说Jinja。它绝对比Django模板引擎更强大,并且是独立的。
如果这是现有Django应用程序的外部插件,则可以创建一个自定义命令并在项目环境中使用模板引擎。像这样;
manage.py generatereports --format=html
但是我认为仅仅使用Django模板引擎而不是Jinja是不值得的。