无法从flask中的send_from_directory()检索文件

时间:2013-07-16 16:13:53

标签: python flask

我有一个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)

然而,这不起作用,有没有其他方法可以做到这一点?或者我做错了什么?

6 个答案:

答案 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/

如何重写网址:apache2nginxlighttpd

答案 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)