关于python:如何在没有其他Django的情况下使用Django模板?

关于python:如何在没有其他Django的情况下使用Django模板?

How do I use Django templates without the rest of Django?

我想在我的(Python)代码中使用Django模板引擎,但是我没有构建基于Django的网站。 如何在没有settings.py文件(和其他文件)且无需设置DJANGO_SETTINGS_MODULE环境变量的情况下使用它?

如果我运行以下代码:

1
2
3
>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')

我得到:

1
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

解决方案很简单。它实际上有据可查,但不太容易找到。 (我必须仔细研究-当我尝试了几种不同的Google搜索时并没有出现。)

以下代码有效:

1
2
3
4
5
6
7
>>> 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本身中,它非常好。如果缺少某些所需功能,您也可以轻松编写扩展名。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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"部分。使用这样的东西:

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

我也建议jinja2。关于djangojinja2有一篇不错的文章,其中提供了一些详细信息,说明了为什么您偏爱后者。


根据Jinja文档,Python 3支持仍处于试验阶段。因此,如果您使用的是Python 3,而性能不是问题,则可以使用django的内置模板引擎。

Django 1.8引入了对多个模板引擎的支持,这需要更改模板的初始化方式。您必须显式配置django提供的默认模板引擎使用的settings.DEBUG。这是不使用django其余部分即可使用模板的代码。

1
2
3
4
5
6
7
8
9
10
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模块中有这个重要的模板标签

1
2
3
4
5
6
7
from django import template

register = template.Library()

@register.filter(name='bracewrap')
def bracewrap(value):
    return"{" + value +"}"

这是html模板文件" temp.html":

1
{{var|bracewrap}}

最后,这是一个将所有内容捆绑在一起的Python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)

输出将是

1
{stackoverflow.com rox}


我也会说Jinja。它绝对比Django模板引擎更强大,并且是独立的。

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

1
manage.py generatereports --format=html

但是我认为仅仅使用Django模板引擎而不是Jinja是不值得的。


除了其他人写的东西之外,如果要在Django> 1.7上使用Django模板,则必须给您的settings.configure(...)调用TEMPLATES变量,然后像这样调用django.setup():

1
2
3
4
5
6
7
8
9
10
11
12
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()

然后,您可以像通常一样从字符串加载模板:

1
2
3
4
from django import template  
t = template.Template('My name is {{ name }}.')  
c = template.Context({'name': 'Rob'})  
t.render(c)

而且,如果您在磁盘中的.configure中写入了DIRS变量,则:

1
2
3
from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})

Django错误:未配置DjangoTemplates后端

http://django.readthedocs.io/zh-CN/latest/releases/1.7.html#standalone-scripts


别。改用StringTemplate-一旦知道它就没有理由考虑其他模板引擎了。


发现了这一点:

http://snippets.dzone.com/posts/show/3339


运行manage.py shell时:

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


我回应以上陈述。 Jinja 2是通用模板的一个很好的Django模板超集。我认为他们正在努力使Django模板与settings.py的耦合度降低一些,但是Jinja应该为您做得很好。


Google AppEngine使用Django模板引擎,您是否看过它们的工作方式?您可以使用它。


推荐阅读