我有一个烧瓶应用程序,我需要渲染由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>
这是我的项目结构
正如您所见,静态文件夹中存在 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 -
以下是显示的页面
为什么文件存在时会发现404
未找到错误?我甚至已经进入目录并通过浏览器运行该文件,它向我展示了预期的可视化。然后出了什么问题?
答案 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>