基于环境变量的jinja2模板化。

j2tmpl的Python项目详细描述


Jinja 2命令行模板呈现程序

Build Status

转换环境变量的jinja2命令行呈现程序 进入上下文中的对象。例如:

DATABASE_MAIN_URI=mysql:3306
DATABASE_MAIN_USERNAME=app
DATABASE_CACHE_URI=redis:6379
DATABASE_CACHE_USERNAME=app

变成:

{"database":{"main":{"uri":"mysql:3306","username":"app"},"cache":{"uri":"redis:6379","username":"app"}}}

这允许使用迭代和其他方法 动态模板。

thereareseveral命令行 Jinja2模板渲染器,它们都共享一个属性 试图解决。

其中支持环境变量(通常是Docker的环境变量) 这些环境变量显示在模板verbatum中。 也就是说,在这种环境下:

DATABASE_MAIN_URI=mysql:3306
DATABASE_MAIN_USERNAME=app
DATABASE_CACHE_URI=redis:6379
DATABASE_CACHE_USERNAME=app

模板必须按以下方式使用:

databases: {    main: {        uri: {{DATABASE_MAIN_URI}}        username: {{DATABASE_MAIN_USERNAME}}    cache: {        uri: {{DATABASE_CACHE_URI}}        username {{DATABASE_CACHE_USERNAME}}

不过,假设您不一定知道有多少数据库 你的集装箱会有吗?这种结构使得 必须根据不同情况定义n内容的实例 在容器部署或基础映像上。

databases: {{%forname,definitionindatabases.items()%}{{name}}: {        uri: {{definition.uri}},        username: {{definition.username}}    },{%endfor%}

处理碰撞

环境变量有时会引起兴趣 构建树结构时出现的问题。一个ValueError将 如果变量定义了两次,则抛出。但是,下面 是一组有效的环境变量:

AUTH_LDAP=true
AUTH_LDAP_USERNAME=app

在模板上下文中,{{ auth.ldap }}必须是 username是其中的一个键。在这种情况下, AUTH_LDAP将下移到一个特殊的_键中。两个 变量将是:

{{auth.ldap._}}=true{{auth.ldap.username}}=app

要使其正常工作,几乎所有环境键中的_都将被删除。 所以,AUTH__LDAP_仍然被翻译成{{ auth.ldap }}。唯一的 异常是带有下划线的变量。在这种情况下,一个'uu' 添加到具有该值的上下文的根。请注意 将创建此单下划线值:

  • _
  • ___
  • ____________________

如果存在多个单独下标的环境变量,则为{{CD1}} 被扔了。

安装

这可以通过两种方式安装:

  1. pip3 install j2tmpl
  2. 下载预构建的二进制文件。

注意,预构建的二进制文件包括整个python解释器 所以它们可以像 confd

用法

这可以通过两种方式使用:处理单个文件或整个目录。

当目录路径作为模板文件传递时, j2tmpl将扫描目录中的任何文件 与template-extensions匹配的扩展名,参数 默认为tmpl,jinja,jinja2,j2,jnj

Note that it will still output to stdout unless -o is used. If it is, then make sure it's a directory as well. If the target directory doesn't exist, it will be created.

除了与该模式匹配的文件外,任何目录 与该模式匹配并以.d结尾的 已扫描模板片段。模板文件也是 作为.d目录中以这些扩展名结尾的文件 全部连接在一起并呈现为一个输出文件 与不带模板的目录名匹配的 扩展名,不带.d

例如,给定以下目录结构:

foo.conf.jinja.d/
    foo-1.jinja
    foo-2.jinja
bar.conf.jinja.d/
    bar-1.jinja
    bar-2.jinja
foo.conf.jinja
baz.conf.jinja

输出目录将包含以下内容:

bar.conf
baz.conf
foo.conf

内置过滤器和扩展

金贾的doloopcontrols 默认情况下启用扩展 trim_blocks 以及lstrip_blocks

最后,以下附加过滤器是可用的:

readfile(str): 读入由str表示的文件内容。尤其是 对容器机密有用。

boolean(str): 将参数转换为布尔值。与 “true”、“yes”和“1”将返回True。其他一切都是假的。

b64encode(str): 基64对值进行编码。

b64解码(str): 基64解码该值。

为什么不确认?

说到confd,为什么不直接用它呢?虽然confd很棒,但它可以 有点太啰嗦了。必须定义一系列配置文件 所有为每一个键确认的键都可以涂抹叮叮声。肯定的 项目,这可能是有道理的,但我经常想 将一些环境变量放入配置文件中 复杂程度很小。

confd是一个5.5MB左右的二进制文件,它仍然小于15MB。有可能 如何使这个更小,我想探索。

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

推荐PyPI第三方库


热门话题
Java Web服务是日期Java的更好选择。util。日期限制?   java Flink cassandraOutputFormat元组需要冻结值   java Split BigInteger,计算数字?   java通过servlet查询mysql中是否存在密钥   在安卓 studio中使用java从google驱动器链接显示pdf文件?   未触发java Spring Web流转换   java错误:二进制运算符“>=”的操作数类型不正确,否则如果(bmi<=18.5>=25.0)   java MySQL upsert(在重复键上)使用JDBC准备语句   如何在java8中执行多个链式操作?   java在Hibernate中获取实体但为空值的属性   java 安卓。小装置。RelativeLayout不能投射到安卓x。抽屉布局。小装置。抽屉布局   Java输入字母   Java中的继承父和子参数化构造函数   java当JtextField被填充时,必须填充JTable单元格。怎么做?   sql如何解决java中的写数据定义操作?   java模块X的多个工件被检索到ApacheIvy中的同一个文件中?   java预览在发布时不显示(Android Studio)