关于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模板引擎,您是否看过它们的工作方式?您可以使用它。


推荐阅读

    更新文件命令linux?

    更新文件命令linux?,工作,系统,地址,信息,时间,命令,目录,基础,标准,网络,lin

    linux下读取文件命令?

    linux下读取文件命令?,系统,工作,地址,数字,图片,信息,网络,命令,文件,一致,l

    linux改文件夹名命令?

    linux改文件夹名命令?,名字,软件,命令,文件,系统,目录,目标,文件名,源文件,

    linux建文件命令格式?

    linux建文件命令格式?,系统,名字,名称,时间,密码,命令,文件,文件夹,不了,数

    下载文件的命令linux?

    下载文件的命令linux?,平台,工具,服务,密码,软件,网络,位置,代理,手机,工作,

    linux命令文件传输?

    linux命令文件传输?,系统,数据,命令,文件,基本知识,源文件,目录,目标,功能,

    linux文件全选命令?

    linux文件全选命令?,电脑,系统,环境,代码,平台,服务,快捷键,文件,命令,权限,l

    linux浏览文件类命令?

    linux浏览文件类命令?,系统,信息,数据,情况,命令,标准,时间,文件,概念,管理,

    linux打包文件夹命令?

    linux打包文件夹命令?,系统,工具,管理,图片,文件,命令,位置,软件,目录,格式,l

    linux中统计文件命令?

    linux中统计文件命令?,系统,信息,数据,情况,工作,文件,时间,档案,标准,名称,L

    linux重名名文件命令?

    linux重名名文件命令?,图片,名称,名字,文件,命令,位置,代码,软件,系统,文件

    linux的建立文件命令?

    linux的建立文件命令?,名称,系统,时间,名字,命令,文件夹,位置,密码,不了,文

    linux06文件命令?

    linux06文件命令?,数字,系统,工作,第一,名字,信息,管理,文件,目录,命令,linux

    linux将文件备份命令?

    linux将文件备份命令?,系统,密码,设备,软件,通讯,较大,认证,服务,数据,文件,L

    linux扩展文件命令?

    linux扩展文件命令?,工作,地址,系统,信息,命令,目录,管理,情况,文件,标准,Lin

    linux命令新增文件夹?

    linux命令新增文件夹?,系统,名字,首次,名称,新增,文件,命令,文件夹,地址,密

    linux推送文件命令?

    linux推送文件命令?,地址,系统,情况,工作,命令,文件,电脑,密码,信息,目录,Lin

    linux文件替换命令行?

    linux文件替换命令行?,资料,命令,文件,数据,名称,系统,实时,工作,字符串,批

    linux可生成文件命令?

    linux可生成文件命令?,名字,命令,名称,文件,文件夹,位置,数据,密码,时间,电