Flask不会渲染任何图像

时间:2018-04-10 09:57:22

标签: python flask

我有一个烧瓶应用程序,我需要渲染由Pygal(可视化库)创建的图像。因此,我计划让用户在端点/viz

访问此创建的图像
app = Flask(__name__)

@app.route("/viz")
def viz():
    img_url = '/home/souvik/PycharmProjects/ServiceHandler/static/histo_visual.svg'
    return render_template('app.html', image_url=img_url)

以下是 app.html 文件

<html>
<head>
     <title> Metric Visualization</title>
</head>
<body>
     <div>
         <p>Bar Chart</p>
         <object type="image/svg+xml" data="{{image_url}}">
         </object>
     </div>
</body>
</html>

这是我的项目结构

enter image description here

正如您所见,静态文件夹中存在 histo_visual.svg 文件。因此,当我运行程序并尝试访问/viz端点时,我收到以下错误< / p>

127.0.0.1 - - [10/Apr/2018 15:08:59] "GET /viz HTTP/1.1" 200 -
127.0.0.1 - - [10/Apr/2018 15:08:59] "GET /home/souvik/PycharmProjects/ServiceHandler/static/ HTTP/1.1" 404 -

以下是显示的页面

enter image description here

为什么文件存在时会发现404未找到错误?我甚至已经进入目录并通过浏览器运行该文件,它向我展示了预期的可视化。然后出了什么问题?

1 个答案:

答案 0 :(得分:1)

当您通过Web服务器访问图像时,图像URL必须相对于Web根目录。您正在使用图像的完整文件路径,但Web上下文中的应用程序无法访问它。

Flask有一种为静态文件生成URL的简洁方法:

@app.route("/viz")
def viz():
    img_url = url_for('static', filename='histo_visual.svg')
    return render_template('app.html', image_url=img_url)

或者,只需在Jinja模板中直接渲染:

<object type="image/svg+xml" data="{{ url_for('static', filename='histo_visual.svg') }}">
         </object>