是Rust MiniJinja模板引擎的Python绑定实验版本。
项目描述
minijinja-py
是MiniJinja的Python绑定实验版本。与Rust版本相比,功能有限。这些绑定使用maturin和pyo3。
当不需要Jinja2的全部功能,且希望Rust和Python之间具有相同的数据集渲染体验时,可以考虑使用MiniJinja代替Jinja2。
使用这些绑定,MiniJinja可以渲染传递给模板的一些Python对象和值,但在可执行方面存在明显限制。
要安装Python的MiniJinja,可以从PyPI 获取 软件包。
$ pip install minijinja
基本API
基本API隐藏在Environment
对象后面。它的行为几乎与minijinja
相同,但有一些Python特定的更改。例如,您可以使用env.debug = True
而不是env.set_debug(True)
。此外,您可以直接将模板的字典传递给环境,或者传递一个loader
函数,而不是使用add_template
或附加source
。
from minijinja import Environment
env = Environment(templates={
"template_name": "Template source"
})
要渲染模板,可以使用render_template
方法
result = env.render_template('template_name', var1="value 1", var2="value 2")
print(result)
目的
MiniJinja试图与Jinja2达到相当高的兼容性,但并不试图以任何代价来实现这一点。因此,您会发现相当多的模板在MiniJinja中无法渲染,尽管它们可能看起来相当无害。然而,您可以编写在Jinja2和MiniJinja中渲染相同结果的模板。这引发了一个问题,为什么您可能想使用MiniJinja。
主要好处是在Rust和Python中达到完全相同的结果。此外,MiniJinja比Jinja2拥有更强的沙盒功能,在某些情况下可能表现得更好。但是,您应该意识到,由于在任一方向上都需要进行序列化,因此会损失一定程度的信息。
动态模板加载
MiniJinja的Python绑定继承了MiniJinja加载模板的底层行为。模板在首次使用时加载,然后进行缓存。模板通过加载器加载。要触发重新加载,您可以调用env.reload()
,或者将env.reload_before_render
设置为True
。
def my_loader(name):
segments = []
for segment in name.split("/"):
if "\\" in segment or segment in (".", ".."):
return None
segments.append(segment)
try:
with open(os.path.join(TEMPLATES, *segments)) as f:
return f.read()
except (IOError, OSError):
pass
env = Environment(loader=my_loader)
env.reload_before_render = True
print(env.render_template("index.html"))
或者,可以使用env.add_template
和env.remove_template
手动加载和卸载模板。
自动转义
默认行为是在文件名以.html
结尾时使用自动转义。您可以通过重写auto_escape_callback
来定制此行为。
env = Environment(auto_escape_callback=lambda x: x.endswith((".html", ".foo")))
如果Python端可用,MiniJinja将使用markupsafe。它将尊重__html__
。
终结器
与MiniJinja中的自定义格式化程序不同,您可以定义一个终结器,这与Jinja2中的工作方式相似。它传递一个值(或者如果使用pass_state
,还可以作为第一个参数传递可选的状态),并可以返回一个新值。如果返回特殊的NotImplemented
值,则将渲染原始值而无需任何修改。
from minijinja import Environment
def finalizer(value):
if value is None:
return ""
return NotImplemented
env = Environment(finalizer=finalizer)
assert env.render_str("{{ none }}") == ""
状态访问
传递给环境的函数,如过滤器或全局函数,可以选择使用pass_state
参数传递模板状态。这与Jinja2中的pass_context
类似。它可以用来查看模板的名称或查找上下文中的变量。
from minijinja import pass_state
@pass_state
def my_filter(state, value):
return state.lookup("a_variable") + value
env.add_filter("add_a_variable", my_filter)
运行时行为
MiniJinja使用自己的运行时模型,这与Python运行时模型不匹配。因此,两者之间存在行为差异,但已做出了有限的努力来弥合这些差异。例如,您将能够调用一些类型的某些方法,但对于像dict和list这样的内置类型,MiniJinja在所有情况下都不会在其一侧公开它们的方法。一个本地产生的MiniJinja映射(例如,使用dict
全局函数)将没有.items()
方法,而传递给MiniJinja的Python字典将会有。
以下是这对于一些基本类型的意义
- Python字典和列表(以及其他作为序列行为的对象)在MiniJinja一侧的表示与在Python中非常相似。
- 在MiniJinja一侧,元组表示为列表,但如果将其传递回Python,将再次作为元组出现。
- 在MiniJinja中,Python对象以类似dict的方式表示,但保留了所有有意义的Python API。这意味着它们通过
__str__
进行字符串化,并允许MiniJinja代码调用它们的非下划线方法。请注意,目前没有使用额外的安全层,因此请小心处理传递的内容。 - 当字符串子类存在
__html__
属性时,MiniJinja的Python绑定可以理解它。这意味着markupsafe.Markup
对象在MiniJinja中会显示为安全字符串。这些信息也可以反向流回Python。 - 对象的字符串化使用
__str__
,这就是为什么混合Python和MiniJinja对象有时会有些令人困惑。 - 在Jinja2中,
foo["bar"]
和foo.bar
之间存在差异,这可以用来区分属性和键,但在MiniJinja中没有这种差异。但是,方法是可以区分的,所以foo.items()
是有效的,并且会在所有情况下正确调用该方法。
赞助商
如果您喜欢这个项目并觉得它很有用,您可以通过成为赞助商。
许可证和链接
- 文档
- 示例
- 问题跟踪器
- MiniJinja游乐场
- 许可证: Apache-2.0
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
minijinja-2.2.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4411052c7a60f8d56468cc6d17d45d72be3d5e89e9578a04f8336cc56601523c |
|
MD5 | eb60c1ebe6fc0f2605b03d5fc0eef50e |
|
BLAKE2b-256 | 59f5f6937bd43692348d2825a9c32b1fd84368853b0dfc7fdd6aa28934eac5d0 |
minijinja-2.2.0-cp38-abi3-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d4df7e4a09be4249c8243207fa89e6f4d22b853c2b565a99f48e478a30713822 |
|
MD5 | 9391476ba06060d54053468cb7d298ef |
|
BLAKE2b-256 | 68dfac513277e86e95d454a30ea0f303f32f9ba83a34ac286fa0df6a573da206 |
minijinja-2.2.0-cp38-abi3-win32.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e431a2467dd6e1bcb7c511e9fbad012b02c6e5453acdd9fbd4c4af0d34a3d1c5 |
|
MD5 | 9fc5c27b6b85fa8143d9099956a897ae |
|
BLAKE2b-256 | fba6c835281b7e96b12ab87b12bac63d0b423caa3b1decd47f698e9317a0a38f |
minijinja-2.2.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c9cad5ccb021ef25b6a271158f4d6636474edb08cd1dd49355aac6b68a48aebb |
|
MD5 | 1bbffc6380bf0afef60c3cdc99d3aeec |
|
BLAKE2b-256 | 80f087dbc02dc870d0bf50a064edf41fb255014d248bf118a3ee6b5721fc33dc |
minijinja-2.2.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 360ea4a93fdf1fe327f3e70eed20ecb29f324ca28fae177de0605dcc29869300 |
|
MD5 | 426ebb1153f566c591f5c1080a95c6d6 |
|
BLAKE2b-256 | 4866bd31830f087226ae5d223fe287b3e4d24f5772d5ad758e32988fe77e4642 |
minijinja-2.2.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4b05e0070c08b550fa9a09ff9c051f47424674332dd56cc54b997dd602887907 |
|
MD5 | 55f2866821c2e0fd2d6bb7d6c7f5ae2e |
|
BLAKE2b-256 | 8f8346d715217e6d378dac7130e125ec4415a58b0d53ceda6a54d6d105c7c77f |
minijinja-2.2.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7a85c67c519b413fc4892854782927e1244a24cbbb3a3cb0ac5e57d9fdb1868c |
|
MD5 | 5202e9620f4f4c918c91ee12b3852bc4 |
|
BLAKE2b-256 | 62ea6b39d37700d72581d8fa5b843f92a9930016b4b381022461c0de6602859e |
minijinja-2.2.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e4154fcf72e81be01c2733b770e6cb3e584851cb2fa73c58e347b04967d3d7c0 |
|
MD5 | 8cec9cca75a5ecd4ee1bd01eae1858dd |
|
BLAKE2b-256 | 61ad6664b63f56449ba74421544a1cd20c57d3f5877d33a3b923f27721465e31 |