You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FastAPI的HTML/Jinja2模板中显示bytes类型图片?

解决FastAPI+Jinja2直接显示bytes类型图片的问题

问题原因

你遇到的核心问题是Jinja2的自动转义机制:默认情况下,Jinja2会将传入字符串中的HTML特殊字符(如<、")转义成实体字符(&lt;、&quot;),导致你拼接的<img>标签被当成纯文本显示,而非渲染成图片。

解决方案

方法1:模板中使用safe过滤器(推荐)

后端仅传递base64编码后的字符串,在模板中手动构建<img>标签并标记为安全内容:

后端代码修改:

import base64
from fastapi import Request
from fastapi.templating import Jinja2Templates

templates = Jinja2Templates(directory="templates")

@app.get("/{id}")
async def root(request: Request, id: str):
    picture = await get_online_person()
    # 将bytes图片转成base64字符串
    img_base64 = base64.b64encode(picture).decode()
    return templates.TemplateResponse(
        "index.html", {"request": request, "img_base64": img_base64}
    )

模板(index.html)修改:

<!-- 根据实际图片格式修改image/png,比如JPG用image/jpeg -->
<img src="data:image/png;base64,{{ img_base64 | safe }}">

方法2:后端用Markup标记安全HTML

通过markupsafe.Markup类将拼接好的<img>标签标记为安全内容,Jinja2会直接渲染而非转义:

后端代码修改:

import base64
from fastapi import Request
from fastapi.templating import Jinja2Templates
from markupsafe import Markup

templates = Jinja2Templates(directory="templates")

@app.get("/{id}")
async def root(request: Request, id: str):
    picture = await get_online_person()
    img_base64 = base64.b64encode(picture).decode()
    # 用Markup标记HTML为安全
    img_tag = Markup('<img src="data:image/png;base64,{}">').format(img_base64)
    return templates.TemplateResponse(
        "index.html", {"request": request, "img": img_tag}
    )

模板(index.html)修改:

{{ img }}

注意事项

确保data:image/png中的格式与实际图片一致:如果是JPG图片,改成data:image/jpeg;GIF则用data:image/gif,否则可能无法正常显示图片。

内容的提问来源于stack exchange,提问作者Kaiss B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:15:33