我有一个html文件,它引用了像这样的静态对象
<img src="img/snacks.png">
<link href="css/bluestrap.css" rel="stylesheet">
因此,浏览器尝试调用此通道,而烧瓶无法执行此操作
http://127.0.0.1:5000/img/snacks.png
多个文件中有很多此类引用,因此无法更改引用。我如何从FLASK
提供这些静态文件我已将所有这些静态文件复制到'static'文件夹并尝试了这个
@app.route('/<path:filename>')
def send_file(filename):
return send_from_directory('/static', filename)
然而,这不起作用,有没有其他方法可以做到这一点?或者我做错了什么?
答案 0 :(得分:20)
在生产中,您不希望使用flask服务器提供静态文件。我建议你使用合适的网络服务器来做到这一点。
对于dev,因为您不想使用url_for
,您可以尝试初始化您的烧瓶应用程序,如下所示。这样,flask知道静态文件的位置。
app = Flask(__name__, static_folder='static')
@app.route('/<path:filename>')
def send_file(filename):
return send_from_directory(app.static_folder, filename)
查看这篇文章有很多信息 Static files in Flask - robot.txt, sitemap.xml (mod_wsgi)
答案 1 :(得分:4)
如果您查看send_from_directory
的文档,您会看到它占用文件在磁盘上的目录的路径。除非您将图像文件保存在名为static
的根级目录中,否则您将需要更新文件路径:
send_from_directory("/some/path/to/static", "my_image_file.jpg")
话虽如此,如果您将此用于任何负载,最好确保您的 Web服务器提供文件,而不是从您的应用程序提供静态文件。
答案 2 :(得分:2)
我认为更好的方法是:
import flask
# ...
@app.route('/img/<fname>')
def legacy_images(fname):
return flask.redirect(flask.url_for('static', filename='img/' + fname), code=301)
不是在两个不同的位置发送文件,而是永久重定向到正确的URL。正如其他人所说,使用nginx或Apache直接提供静态文件也是一个好主意。
答案 3 :(得分:1)
不要在生产中使用Flask的内置服务器。它只用于开发!并且不要使用Flask来提供静态资产。它很慢!在生产中使用Flask前面的web服务器,如apache2,nginx或lighttpd。这些服务器能够重写URL并提供静态资产。
如何部署Flask:http://flask.pocoo.org/docs/deploying/
答案 4 :(得分:0)
您应在代码中的“ / static”之前删除“ /”:
send_from_directory('/static', filename)
将其更改为:
send_from_directory('static', filename)
但是,在某些环境中,服务器本身不允许在 静态 文件夹/目录上运行此命令。因为它被设置为静态文件服务器。例如,对于Google云,您应该在静态文件夹旁边建立一个名为 tmp 的目录,然后使用 tmp 执行send_from_directory 文件夹:
return(send_from_directory('tmp', filename))
答案 5 :(得分:0)
使用:
@app.route('/<path:filename>')
def send_file(filename):
from pathlib import Path
root = Path('.')
folder_path = root / 'static'
return send_from_directory(folder_path, filename, as_attachment=True)