Flask导入静态资源

时间:2013-08-15 21:41:22

标签: flask flask-assets

问题:当我从'/'以外的任何路由访问静态资源时,我收到404。

我的volume.png应用程序中的static文件夹中有一个名为Flask的图像。当我使用'/'将我的主页面路由到@app.route('/')时,它会找到正常的图像,并且当我点击localhost:5000/static/images/volume.png时我可以显示图像。但是,当我使用任何其他链接时,例如'/s',它表示无法在s/static/images/volume.png中找到该图像。即使我创建了一个s目录并将static目录复制到该目录,我也会在输入404时收到localhost:5000/s/static/images/volume.png。我考虑过使用Flask-Assets,但似乎没有太多文档或示例。有什么方法可以确保我的路由可以访问静态资源?

1 个答案:

答案 0 :(得分:2)

您需要在HTML(或CSS)中限定图像的路径:

<!-- This will break in the way you describe -->
<img src="static/images/volume.png" />

<!-- This will not -->
<img src="/static/images/volume.png" />

<!-- Nor will this (assuming you are using a Jinja template) -->
<img src="{{ url_for('static', filename='images/volume.png') }}" />

之所以这样,是因为需要用户代理来解析URI的相对路径(参见section 5.1 of RFC 3968 for the details)。

使用static/images/volume.png会在/生成以下路径:

scheme://host.name/static/images/volume.png

以及/s的以下内容:

scheme://host.name/s/static/images/volume.png
你已经发现了。通过确保为您的资源提供绝对path组件(至少),您可以确保浏览器仅将您提供的路径与schemehost.name合并,而不是schemehost.namepath