问题:当我从'/'
以外的任何路由访问静态资源时,我收到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
,但似乎没有太多文档或示例。有什么方法可以确保我的路由可以访问静态资源?
答案 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
组件(至少),您可以确保浏览器仅将您提供的路径与scheme
和host.name
合并,而不是scheme
,host.name
和path
。