2013-07-16 70 views
8

我有引用这样无法检索send_from_directory文件()在烧瓶

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

因此,浏览器尝试通过调用这个和瓶没有这样做,

http://127.0.0.1:5000/img/snacks.png 
静态对象HTML文件

跨多个文件有很多这样的引用,因此更改引用是不可能的。如何从FLASK

我复制所有这些静态文件的“静态”的文件夹,并试图此

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

但是这不工作为这些静态文件,是否有任何其他方式做到这一点?或者我做错了什么?

回答

14

在生产中,您不想使用瓶服务器来提供静态文件。我建议你使用合适的网络服务器来做到这一点。

对于dev,由于您不想使用url_for,因此您可以尝试按如下所示初始化烧瓶应用程序。这样,烧瓶就知道你的静态文件在哪里。

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)

+0

有太多的图像/ css文件引用来改变它们使用url_for函数,这就是为什么我不想改变它们。有没有办法不改变HTML文件,仍然从Python提供? –

2

如果你看看文档为send_from_directory,你会看到,它需要的路径,以将这些文件在磁盘上举行目录。除非你已经保存在名为static根级目录的图像文件,你需要更新你的文件路径:

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

话虽这么说,如果你使用的是本作什么,这将是任何负载下,最好确保您的网络服务器提供这些文件,而不是从您的应用程序提供静态文件。

+0

我的文件存储在一个名为'img'的文件夹中,名为'static'的根目录下,因此它的存储位置是static/img/snacks。png和浏览器调用http://127.0.0.1:5000/img/snacks.png –

+0

@RijulJain - 是的,但是该目录位于磁盘上的'/ static'?也就是说,你的*文件系统中的'/'下的'usr','etc'等等(不是你的web服务器的根目录)? –

+0

这是在我的web服务器根目录,我如何给我的web服务器根目录相对路径? –

3

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

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

如何重写URL:apache2nginxlighttpd

1

我认为更好的方式来做到这一点是:

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