25

我有一个 html 文件,它引用这样的静态对象

<img src="img/snacks.png">
<link href="css/bluestrap.css" rel="stylesheet">

因此,浏览器尝试通过调用它而烧瓶未能这样做

http://127.0.0.1:5000/img/snacks.png  

跨多个文件有很多这样的引用,因此无法更改引用。我如何从 FLASK 提供这些静态文件

我已将所有这些静态文件复制到“静态”文件夹并尝试了这个

@app.route('/<path:filename>')  
def send_file(filename):  
      return send_from_directory('/static', filename)

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

4

6 回答 6

29

在生产中,您不想使用烧瓶服务器提供静态文件。我建议您使用适当的 Web 服务器来执行此操作。

对于开发人员,由于您不想使用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)

请参阅这篇包含大量信息的帖子 Flask 中的静态文件 - robots.txt、sitemap.xml (mod_wsgi)

于 2013-07-16T16:19:44.710 回答
12

如果您查看文档,send_from_directory您会发现它采用了文件保存在磁盘上的目录的路径。除非您将图像文件保存在名为 的根级目录中static,否则您需要更新文件路径:

send_from_directory("/some/path/to/static", "my_image_file.jpg")

话虽如此,如果您将它用于任何负载下的东西,最好确保您的Web 服务器提供文件,而不是从您的应用程序提供静态文件。

于 2013-07-16T16:51:11.947 回答
6

不要在生产中使用 Flask 的内置服务器。仅用于开发!并且不要使用 Flask 来提供静态资源。很慢!在生产环境中使用 Flask 前面的网络服务器,如 apache2、nginx 或 lighttpd。这些服务器能够重写 URL 并提供静态资产。

如何部署 Flask: http: //flask.pocoo.org/docs/deploying/

如何重写 URL:apa​​che2nginxlighttpd

于 2013-07-16T19:14:13.490 回答
3

我认为更好的方法是:

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 提供静态文件也是一个好主意。

于 2013-07-17T14:15:57.213 回答
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)
于 2021-07-05T22:34:27.050 回答
0

您应该在代码中的“/static”之前删除“/”:

send_from_directory('/static', filename)

将其更改为:

send_from_directory('static', filename)

但是,在某些环境中,服务器本身不允许在静态文件夹/目录上运行此命令。因为它被设置为静态文件服务器。例如,使用 google cloud,您应该在静态文件夹旁边构建一个名为tmp的目录,然后对tmp文件夹执行 send_from_directory 命令:

return(send_from_directory('tmp', filename))
于 2020-07-01T19:18:24.500 回答