如何创建jinja2扩展?

Ale*_*ndr 2 python templates jinja2

我尝试为jinja2进行扩展.我写了这样的代码:

http://dumpz.org/12996/

但我得到例外:'NoneType' object is not iterable.哪个错误?那会回来parse.什么应该接受和返回_media

Bri*_*ell 11

您正在使用a CallBlock,表示您希望扩展程序充当块.例如

{% mytest arg1 arg2 %}
stuff
in
here
{% endmytest %}
Run Code Online (Sandbox Code Playgroud)

nodes.CallBlock期望您传递一个表示扩展的主体(内部语句)的节点列表.目前这是你通过的地方None- 因此你的错误.

一旦解析了参数,就需要继续解析块的主体.幸运的是,这很容易.你可以简单地做:

body = parser.parse_statements(['name:endmytest'], drop_needle=True)  
Run Code Online (Sandbox Code Playgroud)

然后返回一个新节点.在CallBlock接收到被调用(在这种情况下的方法_mytestfunc),其提供逻辑为您的扩展.

body = parser.parse_statements(['name:endmytest'], drop_needle=True)  
return nodes.CallBlock(self.call_method('_mytestfunc', args),[], [], body).set_lineno(lineno)
Run Code Online (Sandbox Code Playgroud)

或者,如果您不希望您的扩展名成为块标记,例如

{% mytest arg1 arg2 %}
Run Code Online (Sandbox Code Playgroud)

你不应该使用nodes.CallBlock,你应该使用nodes.Call,而不是一个身体参数.所以这样做:

return self.call_method('_mytestfunc', args)  
Run Code Online (Sandbox Code Playgroud)

self.call_method 只是一个方便的包装函数,可以为您创建一个Call节点.

我花了几天写Jinja2扩展,这很棘手.文档不多(代码除外).棺材GitHub的项目有扩展的几个例子在这里.