我想在我的(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。关于django与jinja2有一篇不错的文章,其中提供了一些详细信息,说明了为什么您偏爱后者。
根据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":
最后,这是一个将所有内容捆绑在一起的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) |
输出将是
我也会说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模板引擎,您是否看过它们的工作方式?您可以使用它。