配置模板语言

conftl的Python项目详细描述


配置模板语言

简单易学但功能强大的配置文件模板语言。它是web2py的模板语言的"俚语",从头开始编写,并针对文本非html数据进行了优化。

功能

  • 简单易学-对python语法有一定了解的人可以潜入conftl中15分钟。

  • 强大的-模板中的python代码。

  • 用于渲染的命令行工具。

  • 从python代码触发呈现的不同方法。

  • 适用于系统管理、DevOps和类似角色。

  • 性能-针对性能优化的最小代码库。

  • 独立于平台-在Linux和Windows下测试,也可以在其他Unix平台上工作,与Python2.7兼容,与Python3.x兼容。

开始

使用pip安装conftl:

pip install conftl

或者下载源代码:

git clone https://github.com/ttt-fifo/conftl
cd conftl
python setup.py install

来自命令行的hello world:

$ render -c "name='John Smith'"
Hello, {{=name}}
Hello, John Smith

注意:在stdin上写hello,{{=name},然后是enter,ctr+d

来自python repl的hello world:

>>>>>>fromconftlimportrender>>>>>>render(content='Hello, {{=name}}',context=dict(name='John Smith'))'Hello, John Smith'>>>

先决条件

Linux或其他Unix发行版或Windows。

python 2.7或python 3.x

如果当前的实现无法与您的平台协同工作,请放置一个问题,我将尽力提供帮助。

python模块:未来

模板启动

  • 模板中的明文按原样打印到输出中
lorem ipsum dolor sim amet
text clear lorem ipsum

将在输出中完全相同

lorem ipsum dolor sim amet
text clear lorem ipsum
  • 模板中的python代码应该使用标记来编写。}}

例如,如果要将值3赋给i,则可以使用以下语法:

{{i=3}

您还可以编写多行python代码,如下例所示:

{{
import sys

def one():
    return 1

i = 3
}}
  • 将变量值打印到输出中,方法是对其进行标记,并在变量前面放置=号,如下所示{{=myvar}

例如,如果i的值为3并且您输入了模板:

{{=i}

您将在输出中收到:

3

  • 将python代码块与明文和变量输出组合在一起-不应像通常使用python那样缩进代码块,而应使用{{pass}特殊关键字来确定它。

无论何时将代码块写入原始python解释器,都会缩进代码。下面是原始python代码块的示例:

foriinrange(0,2):print('X',i)

上述代码的等效值为:

{{for i in range(0, 2):}}
X {{=i}}
{{pass}}
  • 您可以从模板外部将值传递给模板变量-有多种方法可为模板提供"上下文",例如在模板外部分配变量值。查看后续章节。

  • 高级模板主题可在模板.md中找到

示例

查看项目存储库中的"示例"文件夹。

用于渲染的命令行工具(渲染)

  • 渲染命令行工具的工作方式如下:
pip install conftl
0

将从文件templatename.tmpl获取模板,并将输出写入filename.conf

警告:filename.conf将被覆盖!!!!

如果输入模板不是由-我,你应该把模板代码放在stdin上。

注意:对于Linux和其他Unix系统,请编写模板代码并用CTR+D完成它

注意:对于Windows,用ctr+z完成模板代码,然后按回车键

如果未指定输出文件名(-o),则输出将写入stdout。

  • 在命令行上提供上下文变量

您需要给i4并在模板中使用它。使用-c标志:

pip install conftl
1

为多个变量赋值,只需重复-c标志多次:

pip install conftl
2

要分配复杂变量数据类型,请用双引号将赋值括起来,如下所示:

pip install conftl
3
  • 来自json文件的上下文

json文件格式应类似于:

pip install conftl
4

您可以通过提供如下-j选项来调用render:

pip install conftl
5

注意:命令行变量的优先级高于json文件,例如,如果在json文件中指定i=2,在命令行中指定i=3,则i的最终值为i=3。

  • 为方便起见的环境

为了方便起见,env字典自动包含在上下文中,并且它包含os环境变量。以下示例将它们打印在屏幕上:

pip install conftl
6

注意:env只在命令行工具中自动包含在context中,从python渲染(下一节)不会在context中自动包含env。

如何在模板中使用env?< /P>

许多devops/sysadmin系统通过环境变量将数据传递到其底层脚本。例如,以下shell命令:

pip install conftl
7

(CTR+D在末尾)

将根据系统环境变量为您提供输出:

pip install conftl
8
  • 命令行工具帮助

请参见渲染-h

来自python的渲染模板

从python中呈现模板有三个接口:函数render(…)、类render和decorator@template(…)。请参阅下面的说明:

  • 渲染(…)函数

考虑以下示例:

pip install conftl
9

如您所见,您可以给出context=value,它是一个dict,包含您的变量数据。

函数的签名如下:

git clone https://github.com/ttt-fifo/conftl
cd conftl
python setup.py install
0

可以通过将infile=作为参数(这是模板文件)来使用该函数。如果没有给出,则应给出content=值-这将是一个包含模板内容的字符串。

输出文件可以由outfile=参数给定。如果给定,输出将写入此文件。当outfile=不存在时,输出将作为字符串返回。

如果需要使用默认分隔符以外的其他分隔符,可以这样更改分隔符:

git clone https://github.com/ttt-fifo/conftl
cd conftl
python setup.py install
1
  • 模板装饰器

定义一个将上下文返回为dict的函数。用template decorator装饰函数:

git clone https://github.com/ttt-fifo/conftl
cd conftl
python setup.py install
2

模板装饰器的可能参数是

git clone https://github.com/ttt-fifo/conftl
cd conftl
python setup.py install
3

必须将eihter infile=或content=作为输入。您可以省略outfile=在这种情况下,修饰函数将以字符串形式返回输出。也可以更改分隔符。用模板(…)修饰的函数必须返回dict,否则将引发异常。

这种类型的上下文计算为web2py用户所熟知,因为这是web2py控制器的布局。

  • 渲染对象

Render类中的对象可以在长时间运行的进程中使用。将对象加载到内存中一次,并多次将其用于模板化多个文件:

git clone https://github.com/ttt-fifo/conftl
cd conftl
python setup.py install
4

流内和流外应该是文件句柄或stringio对象。

已知限制

  • 任意的python代码是可能的将由当前模板语言执行。我建议不要给最终用户编写模板代码的机会,除非您知道自己在做什么。恶意最终用户可能会使用多个攻击向量,这些用户有可能执行任意python代码。

  • 如果你想模板化一个html输出,最好使用web2py的模板语言(称为yatl)。yatl在默认情况下打开了xml转义,还打开了多个html帮助函数。

贡献

在不同平台上测试实现。

请毫不犹豫地用叉子叉我到Github上。

如果您发现此代码有问题,请放置问题

版本控制

请参阅此存储库上的标记

作者

todor todorov-ttt fifo

许可证

BSD+其他版权抵免

有关详细信息,请参见许可证。

致谢

感谢massimo di pierroweb2py团队的启发。

徽标:服务器图标箭头

另请参见

conftl和yatl在文档中的区别

在github上的web2pyweb2py

web2py模板语言

同一模板语言的另一个实现可以在weppy项目中找到。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener