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

我想在我的(Python)代码中使用Django模板引擎,但是我没有构build一个基于Django的网站。 如何在不使用settings.py文件(及其他文件)的情况下使用它并设置DJANGO_SETTINGS_MODULE环境variables?

如果我运行下面的代码:

>>> 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. 

解决scheme很简单。 这实际上是有据可查的 ,但不是很容易find。 (我不得不四处搜寻 – 当我尝试了几个不同的Googlesearch时,它没有出现。)

以下代码工作:

 >>> 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文档,了解您可能想要定义的一些设置(作为要configuration的关键字参数)的说明。

Jinja2的 语法与Django的几乎没有什么区别,而且你得到了一个更强大的模板引擎,它也将你的模板编译成字节码(FAST!)。

我用它来模板化,包括在Django本身,这是非常好的。 如果您想要的function缺失,您也可以轻松地编写扩展。

这里是代码生成的一些演示:

 >>> 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模板的任何特定原因? Jinja和Genshi在我看来都是优秀的。


如果你真的想,那么请参阅settings.py上的Django文档 。 尤其是“使用设置而不设置DJANGO_SETTINGS_MODULE ”部分。 使用这样的东西:

 from django.conf import settings settings.configure (FOO='bar') # Your settings go here 

我也会推荐jinja2。 关于djangojinja2有一篇很好的文章 ,提供了一些关于为什么你应该优先考虑的细节信息。

根据Jinja文档, Python 3支持仍然是实验性的 。 所以,如果你在Python 3上,性能不是问题,你可以使用django的内置模板引擎。

Django 1.8引入了对多个模板引擎的支持,这需要对模板初始化的方式进行更改。 您必须显式configuration由django提供的默认模板引擎使用的settings.DEBUG 。 这里是使用模板而不使用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" 

我也会说Jinja 。 它肯定比Django模板引擎更强大 ,它是独立的

如果这是对现有Django应用程序的外部插件,则可以创build自定义命令并在您的项目环境中使用模板引擎。 喜欢这个;

 manage.py generatereports --format=html 

但是我不认为用Django模板引擎代替Jinja是值得的。

感谢帮助的人。 这里还有一个补充。 您需要使用自定义模板标签的情况。

假设你在模块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} 

别。 使用StringTemplate代替 – 一旦你知道它,没有理由考虑任何其他模板引擎。

我回应上述说法。 Jinja 2是Django模板的一个非常好的超集。 我认为他们正在努力使Django模板与settings.py耦合一点,但Jinja应该为你做好。

运行manage.py shell时:

 >>> from django import template >>> t = template.Template('My name is {{ me }}.') >>> c = template.Context({'me': 'ShuJi'}) >>> t.render(c) 

Google AppEngine使用Django模板引擎,你看看他们是怎么做的吗? 你可能只是使用它。