Flask渲染图像(和数据)

时间:2014-01-29 12:58:04

标签: flask jinja2

我有一个非常简单的博客网站,由Flask和peewee orm支持。只有(降价)帖子和图片。图像具有图像文件(显然),标题和简要描述。我希望能够添加一个过滤器标签或其他东西,并基本上把我的帖子标记为{{ img.id|3 }},并让它渲染图像使用id=3中的div,标题和说明?

2 个答案:

答案 0 :(得分:4)

您可以使用宏和Python函数来实现它。

首先,添加一个全局模板。

@app.template_global()
def get_image(id):
    # not sure if this is the way to do it with peewee
    return Image.select().where(Image.id == id).get()

这样,您可以调用{{ get_image(id=3) }}并获取图像对象。当然,它仍然无法解决您的问题。

要以您希望的方式生成HTML,请创建一个Jinja2宏来生成HTML块。

{% macro img(id) %}
    {% set obj = get_image(id) %}  {# here I'm calling the template global function #}
    <img src="{{ obj.url }}" />
    <span class="title">{{ obj.title }}</span>
    <span class="description">{{ obj.description }}</span>
{% endmacro %}

现在,您可以致电{{ img(id=3) }}甚至{{ img(3) }}来打印img宏中的HTML。

在这里,我假设你的对象有urltitledescription。如果您有提供图片的路线,也许您想要的是url_for('some_route', id=id)而不是{{ obj.url }}

当然,您可以通过我的get_image函数提供HTML,甚至可以从我的宏查询数据库,但这样我就将问题分开了。

答案 1 :(得分:1)

对于Jinja2,您可以使用template_filter添加自己的过滤器。过滤器可以带参数。

如果您已在模板中包含具有链接属性的图像对象,则最好使用此属性。

如果您有这种图像的特殊路径,最好使用带有指定参数的url_for。如果它有很多参数,你总是可以添加自定义过滤器。