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

Dar*_*zer 99 python django templates template-engine django-templates

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

如果我运行以下代码:

>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
Run Code Online (Sandbox Code Playgroud)

我明白了:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
Run Code Online (Sandbox Code Playgroud)

Dar*_*zer 132

解决方案很简单.它实际上有很好的记录,但不容易找到.(我不得不四处寻找 - 当我尝试一些不同的谷歌搜索时,它没有出现.)

以下代码有效:

>>> 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.'
Run Code Online (Sandbox Code Playgroud)

有关您可能要定义的一些设置的描述(作为配置的关键字参数),请参阅Django文档(上面链接).

  • 并从文件中获取它:settings.configure(TEMPLATE_DIRS =(".",))t = get_template('test.html') (13认同)
  • 我还需要在Template构造函数之前调用django.setup(). (6认同)

nos*_*klo 44

Jinja2 语法与Django几乎完全相同,只有很少的差异,你会得到一个更强大的模板引擎,它也可以将你的模板编译成字节码(快!).

我用它来模板化,包括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'
Run Code Online (Sandbox Code Playgroud)

  • 我在我的一个项目中使用Jinja,因为我想要一些我非常熟悉的东西,但不希望我的用户(因为它是一个可分发的应用程序)必须安装Django.一个优点是可以使用easy_install安装Jinja. (4认同)
  • Django也可以通过easy_install安装. (4认同)

Joh*_*kin 9

您想使用Django模板的任何特殊原因?无论神社元史是,在我看来,优越.


如果你真的想,请参阅Django文档settings.py.特别是"使用没有设置的设置DJANGO_SETTINGS_MODULE"部分.使用这样的东西:

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
Run Code Online (Sandbox Code Playgroud)


Rob*_*nde 9

除了其他人写的之外,如果你想在 Django > 1.7 上使用 Django 模板,你必须给你的 settings.configure(...) 调用 TEMPLATES 变量并调用 django.setup() ,如下所示:

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()
Run Code Online (Sandbox Code Playgroud)

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

from django import template   
t = template.Template('My name is {{ name }}.')   
c = template.Context({'name': 'Rob'})   
t.render(c)
Run Code Online (Sandbox Code Playgroud)

如果您从磁盘在 .configure 中写入 DIRS 变量:

from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
Run Code Online (Sandbox Code Playgroud)

Django 错误:未配置 DjangoTemplates 后端

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


olt*_*olt 7

我也推荐jinja2.有一篇很好的关于djangovs.的文章jinja2,提供了一些关于为什么要优先考虑后者的详细信息.


Pra*_*mod 5

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

Django 1.8 引入了对多个模板引擎的支持,这需要更改模板的初始化方式。您必须明确配置settings.DEBUGdjango 提供的默认模板引擎使用哪个。这是使用模板而不使用其余 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"
Run Code Online (Sandbox Code Playgroud)