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

适配Flask应用中Matplotlib图表的安全Content-Security-Policy设置问询

解决Flask中Matplotlib图表因CSP无法显示的问题

原因分析

Matplotlib动态生成的图表如果是通过data:image/png;base64,...这类Data URI直接嵌入页面的,img-src 'self'的CSP规则仅允许加载同域下的静态图片资源,并不包含Data URI格式的内联图片,因此会被浏览器安全策略拦截。

可行的CSP配置方案

根据你的图表生成方式,选择以下适配方案:

1. 允许Data URI加载图片(推荐)

如果图表是通过base64编码的Data URI嵌入页面,修改CSP的img-src规则,添加data:即可:

response.headers['Content-Security-Policy'] = "img-src 'self' data:"

这种配置既保留了同域资源的安全限制,又兼容动态生成的base64格式图表。

2. 允许内联图片(安全性较低,不推荐)

若图表是通过内联脚本直接生成的,可临时添加'unsafe-inline'到img-src规则:

response.headers['Content-Security-Policy'] = "img-src 'self' 'unsafe-inline'"

注意:'unsafe-inline'会削弱CSP的安全防护能力,仅在无其他替代方案时使用。

3. 静态文件加载方案(最安全)

将Matplotlib生成的图表保存到Flask的静态目录,通过同域URL加载,此时img-src 'self'规则完全适用。示例代码:

import matplotlib.pyplot as plt
import os
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def show_chart():
    # 生成图表
    plt.plot([1,2,3], [4,5,1])
    # 保存到静态目录
    chart_path = os.path.join(app.static_folder, 'images', 'chart.png')
    plt.savefig(chart_path)
    plt.close()
    # 传递静态资源URL到模板
    return render_template('chart.html', chart_url='/static/images/chart.png')

内容的提问来源于stack exchange,提问作者stumpsprout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:45:54