【问题标题】:How to send images in a jinja html template?如何在 jinja html 模板中发送图像?
【发布时间】:2018-01-25 07:43:53
【问题描述】:

所以我有一个烧瓶 + jinja 的设置,我正在尝试在 jinja 呈现的 html 文件中显示图像。

在 Python 中,我将其转换为 base64,然后将其发送到模板。然后我使用图像标签来显示图像。

<img src="data:image/jpeg;base64,{{ myimage }}">

我已经确认 Python 编码是正确的,当我简单地编写一个嵌入了 base64 的 html 文件时,它就会显示出来。它似乎失败的地方是模板稍微修改了输出。特别是:

<img src=3D"data:;base64,/9j/4QAYR
...
baW4WqWj/2Q=3D=3D"/>

Jinja 似乎在搞砸,在一些看起来不应该的地方添加了 3D 文本。我没有指定任何不同的内容,当我将 myimage 打印为文本时,它以我期望的方式出现,从 /9j 开始,以 /2Q==

结束

我不确定我在 Jijna 中的解释方式是否有问题,但它就是无法加载。我在电子邮件源中看到了图像 src 标记,但我期望图像被加载的地方没有任何内容。

【问题讨论】:

    标签: python html flask jinja2


    【解决方案1】:

    将变量 myimage 标记为安全:

    <img src="data:image/jpeg;base64,{{ myimage | safe }}">
    

    简单的单文件应用(使用请求库):

    from flask import Flask, render_template_string
    import base64
    import requests
    
    app = Flask(__name__)
    
    global _base64_encoded_image
    
    
    @app.route('/')
    def index():
        _html_template = '''
            <p><img src="data:image/jpeg;base64,{{ myimage | safe }}"><p>
            <p><img src="data:image/jpeg;base64,{{ myimage | e }}"><p>    
            <p><img src="data:image/jpeg;base64,{{ myimage }}"><p>
        '''
        global _base64_encoded_image
        return render_template_string(_html_template, myimage=_base64_encoded_image)
    
    
    @app.before_first_request
    def before_first_request():
        global _base64_encoded_image
        _url = "http://via.placeholder.com/200?text=Flask/Jinja2"
        _r = requests.get(_url)
        _base64_encoded_image = base64.b64encode(_r.content)
        print _base64_encoded_image
    
    
    if __name__ == '__main__':
        app.run()
    

    【讨论】:

    • 不幸的是,这不起作用。它仍然像内容传输编码一样引用可打印,并且仍然用不应该存在的“3D”混淆编码。
    【解决方案2】:

    这看起来像是一个 URL 编码问题,因为 = 是该 base64 字母表中使用的一个字符,其 URL 编码是 %3D。尝试在使用 Jinja 渲染之前对 base64 数据执行urllib.quote

    【讨论】:

    • 我尝试在将变量传递给 Jinja 之前执行 urllib.parse.quote 但这并没有改变结果。
    • 您能否发布您尝试渲染的 base64 数据以及渲染的 HTML 中显示的内容?我正在测试一个带有尾随 == 的数据示例,并且渲染它没有问题。
    • 很遗憾,我目前无法发布该数据。我只能确认,当我通过 base64 解码器抛出它,或者将 html 写入普通的 .html 文件时,它会正确呈现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2023-03-09
    • 2014-09-15
    相关资源
    最近更新 更多