【问题标题】:jinja2-humanize-extension - how to implement these into code?jinja2-humanize-extension - 如何将这些实现到代码中?
【发布时间】:2021-08-30 17:27:32
【问题描述】:

我想在我的 jinja2 烧瓶应用程序中使用人性化功能,文档中的示例对我来说太模糊了。我用 pip 安装了扩展并尝试按如下方式实现它们:

我想渲染的是这样的:

<small class="text-muted">Time remaining: {{ ((submission.date_expiration - now)|naturaldelta()) }}</small>

虽然我不断收到错误:jinja2.exceptions.TemplateAssertionError: No filter named 'naturaldelta'.

我将env = Environment(extensions=["jinja2_humanize_extension.HumanizeExtension"]) 添加到我的init.py 中,但意识到这并没有正确添加扩展。有人有这方面的经验吗?

【问题讨论】:

标签: python flask jinja2


【解决方案1】:

猜测您在从 Flask 应用程序中调用 render_template 时遇到了该错误。我注意到扩展文档中的full example 只提到了使用env.from_string 进行渲染。

如何在普通的 Flask 应用上注册?一旦你定义了应用程序,似乎你可以设置app.jinja_options

app = Flask(__name__)
app.jinja_options['extensions'] = ['jinja2_humanize_extension.HumanizeExtension']

我实际上并不确定上述方法是否“正确”。我四处寻找有关如何在 Flask 应用程序上注册 Jinja2 env 的文档,但找不到太多。以下是我的测试方法...

有了来自this answer 的一些线索,您的 Flask 应用程序应该有一个属性 app.jinja_options,在我的新应用程序的情况下,它是空字典:

>>> app = Flask(__name__)
>>> app.jinja_options
{}

所以我添加了扩展名:

>>> app.jinja_options['extensions'] = ['jinja2_humanize_extension.HumanizeExtension']

然后验证:

>>> app.jinja_options
{'extensions': ['jinja2_humanize_extension.HumanizeExtension']}

然后在终端用Flask的render_template_string进行测试:

>>> from flask import render_template_string
>>> with app.app_context(): 
...  print( render_template_string('''{{300000|humanize_naturalsize()}}''', asd='abc'))
... 
300.0 kB

当您使用render_template 将模板呈现为标准时,这应该具有相同的效果

【讨论】:

  • 嘿 v25,非常感谢您的深入回复!我还努力寻找在 Flask 中注册 Jinja2 环境的文档。那么这与 render_template_string 有什么关系呢?关于 env.from_string,我不太明白它在做什么。你介意解释一下吗?这是否意味着这些扩展功能不能直接在 HTML 文件中实现?我很好奇,在按照您的描述添加扩展后,我是否可以在我的 HTML 代码(例如帖子中显示的行)中正常使用这些函数。感谢您的帮助!
  • humanize 文档中的示例使用env.from_string 返回一个模板,然后可以使用template.render 呈现该模板。我认为这个示例假设您只是直接使用 Jinja2(Jinja2 是一个由 flask 使用的模块,但也可以单独使用)。我的回答中的方法适用于 Flask,在任何情况下您通常都无法直接访问 env 实例,而您只需使用 render_template (尽管您没有说明 如何 你正在渲染你的模板——你只显示了 HTML 模板代码)。
  • 对于render_template_string,这只是一个Flask函数,它接受一个字符串而不是HTML文件的路径,这对于在控制台中尝试一些东西很有用(在with app.app_context块内) ,正如我在回答中所说的那样:它使我不必将模板代码写入文件,然后使用该路径调用render_template。但是是的,我的回答中的方法也应该与“你的 HTML 代码”兼容。请尝试一下,如果可行,请考虑将此答案标记为接受):) 希望这些 cmets 清除一些东西。
  • 感谢您的解释 :) 我会对其进行测试并通知您!
  • 我让它像你展示的那样在终端中工作,但我的 render_template 仍然出现同样的错误。我假设我没有正确地将它添加到我的代码中的 app.jinja_options 中。这是我的代码:from flask import Flask app = Flask (__name__) app.jinja_options['extensions'] = ['jinja2_humanize_extension.HumanizeExtension'] @app.route("/submissions", methods=["GET", "POST"]) @login_required def submissions(): ... return render_template("curate.html", title="Curate", submission_count=submission_count, submissions=submissions, now=now)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2019-07-18
  • 2011-06-16
  • 1970-01-01
  • 2011-12-08
  • 2014-12-10
相关资源
最近更新 更多