Flask项目CSS样式表调用url_for加载平行目录图片失败问题求助
问题原因
你遇到的问题核心是:{{ url_for() }} 属于Jinja2模板语法,仅会在Flask渲染的**模板文件(即Templates目录下的html文件)**中被解析执行,独立的.css文件默认不会经过Flask模板引擎处理,所以你写在css里的{{ url_for('static', filename='/images/bckgrnd.jpg') }}会被直接当成普通字符串,不会被替换为实际的静态资源路径。
浏览器解析CSS中的相对路径时,是相对于CSS文件本身的存储位置的,你的CSS文件存放在static/css/目录下,未被解析的url字符串会被浏览器判定为相对路径,因此才会发起/static/css/bckgrnd.jpg的请求,最终返回404。
解决方案
方案1:直接使用相对路径(最推荐,适配字体等所有静态资源场景)
直接基于CSS文件的位置写相对路径即可,不需要使用模板语法:
body { background-color: rgb(180,160,120); background-image: url('../images/bckgrnd.jpg'); background-repeat: no-repeat; background-attachment: fixed; background-size: cover; }
如果后续要加载fonts目录下的字体,同理写相对路径即可,示例:
@font-face { font-family: 'Carolingian'; src: url('../fonts/Carolingian.ttf') format('truetype'); }
方案2:将动态路径样式写在模板的style标签中
如果你需要用url_for动态生成路径,可以把这段样式移到base.html模板的<head>标签内的<style>标签中,模板内的Jinja语法会被正常解析:
<head> <!-- 其他head内容 --> <style> body { background-color: rgb(180,160,120); background-image: url({{ url_for('static', filename='images/bckgrnd.jpg') }}); background-repeat: no-repeat; background-attachment: fixed; background-size: cover; } </style> </head>
不推荐方案
也可以配置Flask将CSS文件作为模板渲染,但会额外增加服务端开销,没有必要,因此不推荐使用。
内容的提问来源于stack exchange,提问作者M. Nace
相关产品推荐
相关产品推荐

