2010-11-21 94 views
79

是否有任何聪明的解决方案将静态文件存储在Flask的应用程序根目录中。 的robots.txt和sitemap.xml的预计/被发现,所以我的想法是为他们创造路线:Flask中的静态文件 - robot.txt,sitemap.xml(mod_wsgi)

@app.route('/sitemap.xml', methods=['GET']) 
def sitemap(): 
    response = make_response(open('sitemap.xml').read()) 
    response.headers["Content-type"] = "text/plain" 
    return response 

一定有什么东西更方便:)

回答

60

最好的办法是设置static_url_path到根URL

from flask import Flask 

app = Flask(__name__, static_folder='static', static_url_path='') 
+2

这是一个为静态文件工作的人, 谢谢。 +1 – 2014-06-09 01:16:47

+0

值得一提的是,static_folder不必位于项目文件夹中。例如static_folder ='/ app/ui'很好。 – ashic 2017-10-18 23:58:09

15

提供静态文件无关与用于传递动态内容的应用程序有关。提供静态文件的正确方式取决于您使用的服务器。毕竟,当您启动并运行您的应用程序时,您需要将其绑定到Web服务器。我只能说Apache apache httpd,所以在虚拟主机中定义了服务静态文件的方式,通过mod-wsgi绑定到您的应用程序。下面是指南会告诉你如何服务站点地图,robots.txt或任何静态内容: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

+0

这就是我一直在寻找的答案。谢谢! – biesiad 2010-11-22 15:29:34

+1

应用程序旨在提供内容,一些动态的和一些静态的。 – 2017-04-06 21:55:53

65

@vonPetrushev是正确的,在生产中,你会希望通过nginx的IIS或Apache来提供静态文件,但对于发展开发环境很简单,让您的python应用程序也可以提供静态内容,这样您就不必担心更改配置和多个项目。为此,您需要使用SharedDataMiddleware

from flask import Flask 
app = Flask(__name__) 
''' 
Your app setup and code 
''' 
if app.config['DEBUG']: 
    from werkzeug import SharedDataMiddleware 
    import os 
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { 
     '/': os.path.join(os.path.dirname(__file__), 'static') 
    }) 

本例假设您的静态文件位于“静态”文件夹中,根据您的环境进行调整。

+0

谢谢!这是我需要的!我期待为我的制作heroku做到这一点。请参阅以下主题上的答案:http://flask.pocoo.org/mailinglist/archive/2012/2/22/flask-on-heroku-%2B-gunicorn-static-files/#20ff50d1dac06bf228b38d62ab11c6a9 – David 2012-03-29 22:45:34

+0

这是非常非常不错的提示! – 2012-09-02 18:28:30

+2

抬头 - 现在有一个更简单的方法来处理这个问题。检查我的回复。 – 2013-01-17 23:00:06

3

从这里的文件:http://flask.pocoo.org/docs/quickstart/#static-files

动态Web应用程序需要静态 的文件。通常这里的 的CSS和JavaScript文件都是来自 。理想情况下,您的web服务器 被配置为为您服务, ,但在开发期间,Flask也可以做 。只需在您的软件包中创建一个文件夹 称为静态文件,或者将 复制到您的模块中,然后在 应用程序的/ static上创建一个文件夹 。

生成URL到 URL的一部分,使用特殊的 '静态' 网址 名称:

url_for( '静', 文件名= 'style.css文件')

文件必须作为static/style.css存储在 文件系统中。

5

这可能已添加,因为这个问题被问,但我一直在寻找通过烧瓶的“helpers.py”我发现flask.send_from_directory:

send_from_directory(directory, filename, **options) 
''' 
    send_from_directory(directory, filename, **options) 
    Send a file from a given directory with send_file. This 
    is a secure way to quickly expose static files from an upload folder 
    or something similar. 
''' 

...它引用flask.send_file :

send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False) 

...这似乎更多的控制更好,虽然send_from_directory直接通过到由send_file通过**选项。

0

我也有同样的困境。做了一些搜索,发现我的回答(MHO):

不妨从文档

动态Web应用程序需要静态文件,以及引用。这通常是CSS和JavaScript文件的来源。 理想情况下,您的Web服务器已配置为为您提供服务,但在开发期间,Flask也可以这样做。只需在您的软件包或模块旁创建一个名为static的文件夹,它将在应用程序的/ static处可用。

恕我直言:当你的应用程序是为生产,静态文件服务应该(或最好)的Web服务器(nginx的,阿帕奇)配置;但在开发期间,Flask使其可用于提供静态文件。这是为了帮助您快速发展 - 无需安装网络服务器等。

希望它有帮助。

13

另一种方式来发送静态文件是使用这样一个包罗万象的规则:

@app.route('/<path:path>') 
def catch_all(path): 
    if not app.debug: 
     flask.abort(404) 
    try: 
     f = open(path) 
    except IOError, e: 
     flask.abort(404) 
     return 
    return f.read() 

我用这个来尝试开发时最小化设置。我从http://flask.pocoo.org/snippets/57/

的想法。此外,我用我的单机上烧瓶但在生产服务器和Apache部署发展。我使用:

file_suffix_to_mimetype = { 
    '.css': 'text/css', 
    '.jpg': 'image/jpeg', 
    '.html': 'text/html', 
    '.ico': 'image/x-icon', 
    '.png': 'image/png', 
    '.js': 'application/javascript' 
} 
def static_file(path): 
    try: 
     f = open(path) 
    except IOError, e: 
     flask.abort(404) 
     return 
    root, ext = os.path.splitext(path) 
    if ext in file_suffix_to_mimetype: 
     return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext]) 
    return f.read() 

[...] 

if __name__ == '__main__': 
    parser = optparse.OptionParser() 
    parser.add_option('-d', '--debug', dest='debug', default=False, 
         help='turn on Flask debugging', action='store_true') 

    options, args = parser.parse_args() 

    if options.debug: 
     app.debug = True 
     # set up flask to serve static content 
     app.add_url_rule('/<path:path>', 'static_file', static_file) 
    app.run() 
+1

抬头 - 现在有一个更简单的方法来处理这个问题。检查我的回复。 – 2013-01-17 23:04:56

+0

如果您需要为多个路径提供服务,绝佳方式! – 2013-02-14 08:15:04

21

尽管这是一个老问题回答,我回答这个问题,因为这个帖子出现相当高的谷歌的结果。虽然它没有在文档中涉及,但如果您阅读Flask Application对象构造函数the API docs,则会覆盖它。通过传递命名参数static_folder像这样:

from flask import Flask 
app = Flask(__name__, 
      static_folder="/path/to/static", 
      template_folder="/path/to/templates") 

...您可以定义一个静态文件是从服务。同样,你可以定义一个template_folder,你static_url_path名称。

+0

优秀!我猜静态文件的路由仍然是/ static/.... – chmike 2013-01-19 09:08:53

+0

@chmike是的,它默认为'/ static',但你可以通过重写'static_url_path'来改变它。 – 2013-01-20 03:51:47

+0

这是正确的,但其他答案更灵活。这一点受限于它只能服务于一个目录路径的事实。 – 2013-02-14 08:14:37

53

最干净的这个问题的答案是answer这个(相同)question

from flask import Flask, request, send_from_directory 
app = Flask(__name__, static_folder='static')  

@app.route('/robots.txt') 
@app.route('/sitemap.xml') 
def static_from_root(): 
    return send_from_directory(app.static_folder, request.path[1:]) 

总结:

  • 大卫指出,用正确的配置它ok to serve a few static files through prod
  • 寻找/robots.txt不应导致重定向到/static/robots.txt。 (在Seans回答这让您实现它不是立即清除)
  • 这是不干净的静态文件添加到应用程序的根文件夹
  • 最后,所提出的解决方案看起来比加入中间件的方法更清洁: