Flask静态文件转为绝对路径

6
有没有一种Flask函数或简单的方法可以将静态文件路径转换为其在磁盘上的绝对文件路径?例如,"/static/css/style.css"需要根据应用程序或蓝图中定义的静态文件夹返回style.css的绝对路径。
为了澄清,我目前正在使用Flask-Asset。
{% assets "all_js" %}
    <script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}

模板中的上述部分会在生产环境中生成这个。不使用相对路径的主要原因是为了能够从无cookie域名提供静态内容。
<script type="text/javascript" src="/static/public/all.580e5dae.js"></script>

你如何期望处理这个事实:当部署时,Flask可能不知道如何找到静态文件夹的位置,因为确切的位置并未在Flask中设置,而是在Apache或其他Web服务器配置中设置的? - Mark Hildreth
正如Miguel所说,请查看https://github.com/miracle2k/flask-assets/blob/master/src/flask_assets.py检查get_static_folder函数。看起来是一个很好的起点。 - jab
3个回答

2

我不太清楚您为什么需要获取静态文件的路径,但无论如何,如果您查看Flask-Assets的实现代码,您可能会得到一些想法。该代码可以从应用程序和蓝图中定位静态文件并以不同的方式处理它们。

也许您会发现Flask-Assets恰好符合您的需求。


1
简单的解决方法是使用'static/css/name_of_css.css'代替url_for('static', filename='name_of_css.css')

1
“url_for('static',filename ='/css/font-awesome.min.css')”需要在文件名中包含css文件夹,因为静态文件只能解析到实际的静态文件夹。 - Daniel Hitzel

0
import os
base_path = os.getcwd() # Replace this appropriately with your static folder path
# We shouldn't use 'static' twice if it is already there in the base_path
# as correctly pointed out by mark-hildreth
if os.path.basename(base_path) == 'static':
    file_path = os.path.normpath('/css/style.css')
else:
    file_path = os.path.normpath('/static/css/style.css')
abs_path = os.path.join(base_path+file_path)
if os.path.exists(abs_path): # Verifies existence of given path
    print abs_path

这只是其中的一部分,但并不是全部。首先,您正在使用'/style/css',但问题特别使用了'/static/css/style.css'作为示例的一部分。您的代码通过去掉/static部分神奇地做到了正确的事情,但在某些配置中,它可能会使用/media而不是/static。此外,如果您打算将其传递给join,为什么要使用字符串连接来连接路径? - Mark Hildreth
这仍然没有解决问题。您假设如果URL中包含“/static”,则“/static”是文件名的一部分,但这并不保证。 - Mark Hildreth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接