我如何在没有Django其余部分的情况下使用Django模板?

时间:2020-03-06 14:24:05  来源:igfitidea点击:

我想在我的(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是不值得的。