Python 如果没有Django的其余部分,如何使用Django模板?

Python 如果没有Django的其余部分,如何使用Django模板?,python,django,templates,django-templates,template-engine,Python,Django,Templates,Django Templates,Template Engine,我想在我的(Python)代码中使用Django模板引擎,但我没有构建基于Django的网站。如何在没有settings.py文件(以及其他文件)和设置DJANGO_settings_MODULE环境变量的情况下使用它 如果我运行以下代码: >>> import django.template >>> from django.template import Template, Context >>> t = Template('My name

我想在我的(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的模板有什么特别的原因吗?在我看来,和都是优越的


如果你真的想,那就去看电影吧。特别是“在不设置DJANGO\u设置模块的情况下使用设置”部分。使用类似以下内容:

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

Google
AppEngine
使用Django模板引擎,你看过他们是如何做到的吗?您可以直接使用它。

发现:


解决方案很简单。事实上,这很容易找到。(我不得不四处寻找——当我尝试了一些不同的谷歌搜索时,却没有想到。)

以下代码起作用:

>>> 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文档(上面链接),了解您可能要定义的一些设置(作为要配置的关键字参数)。

与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'

我赞同上述发言。Jinja2是Django模板的一个非常好的超集,用于一般用途。我认为他们正在努力使Django模板与settings.py的耦合度降低一点,但是Jinja应该对您有好处。

我还推荐jinja2。有一个关于django与jinja2的比较,提供了一些关于为什么你应该选择后者的详细信息。

不要。当你知道它的时候,就没有理由考虑其他模板引擎了。它肯定比Django模板引擎更强大,而且它是独立的

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

manage.py generatereports --format=html

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

在运行
manage.py
shell时:

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

谢谢大家的帮助。这里还有一个补充。需要使用自定义模板标记的情况

假设您在模块read.py中有这个重要的模板标记

from django import template

register = template.Library()

@register.filter(name='bracewrap')
def bracewrap(value):
    return "{" + value + "}"
这是html模板文件“temp.html”:

最后,这里是一个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}

根据Jinja文件。因此,如果您使用的是Python3,并且性能不是问题,那么可以使用django的内置模板引擎

Django 1.8引入了对它的支持,需要更改模板的初始化方式。您必须显式配置django提供的默认模板引擎使用的
设置.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"

除了其他人编写的内容之外,如果要在Django>1.7上使用Django模板,则必须提供设置。configure(…)调用TEMPLATES变量并调用Django.setup(),如下所示:

来自django.conf导入设置的

设置。配置(模板)=[
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
'DIRS':['.],#如果您希望从文件中获取模板
“应用程序目录”:False,#我们没有应用程序
},
])
进口django
django.setup()
然后,您可以像平常一样从字符串加载模板:

来自django导入模板的

t=template.template('我的名字是{{name}}'
c=template.Context({'name':'Rob'})
t、 渲染(c)
如果您在.configure中写入了DIRS变量,请从磁盘:

从django.template.loader导入get\u模板
t=get_模板('a.html')
t、 呈现({'name':5})


我正在我的一个项目中使用Jinja,因为我想要一些我非常熟悉的东西,但不希望我的用户(因为它是一个可分发的应用程序)必须安装Django。另外,Jinja可以通过easy_安装安装。Django也可以通过easy_安装安装。Jinga还没有正式支持Python3。根据该网站的说法,它仍然是实验性的。要从一个文件中获取它:settings.configure(TEMPLATE_DIRS=(“,))t=get_TEMPLATE('test.html')settings.configure()的文档在这里-从上面的“文档化”链接,这在版本1.7之前是正确的。从1.8开始,似乎您不再需要
设置。configure()
。如果您想包含其他模板,或使用模板继承,Bryce的上述解决方案是必要的。我还需要在模板构造函数之前调用django.setup()。Python端口看起来太像Java。我更喜欢Jinja2,因为它的
{%set%}
语法和与Twig模板引擎(PHP)相同。最好总是编写跨平台代码,但性能差异并不关键——例如,python总是比PHP工作得慢,所以如果需要性能,最好使用PHP、Twig和Symfony2或其他工具创建站点。悲哀但却是事实。@Croll,如果你的网站执行复杂的计算,那么python库的速度就快得惊人,否则瓶颈就是数据库,或者你很可能在做一些非常错误的事情
django.template.base.add_to_builtins(“read”)
为我引发一个
ValueError
错误。我正在使用django 1.10.1
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"