Flask中的静态文件 – robot.txt,sitemap.xml(mod_wsgi)

是否有任何聪明的解决scheme将静态文件存储在Flask的应用程序根目录中。 robots.txt和sitemap.xml预计会在/中find,所以我的想法是为他们创build路线:

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

必须有更方便的东西:)

最好的方法是将static_url_path设置为根url

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

@vonPetrushev是正确的,在生产中,你会想通过nginx或apache提供静态文件,但是为了开发,你的开发环境很简单,让你的python应用程序也提供静态内容,所以你不必担心关于改变configuration和多个项目。 为此,您需要使用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') }) 

这个例子假设你的静态文件在“静态”文件夹中,根据你的环境进行调整。

这个问题的最清晰的答案是这个(相同的) 问题的答案 :

 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:]) 

总结:

  • 正如David所指出的那样,通过正确的configuration,可以通过prod来提供一些静态文件
  • 寻找/robots.txt不应该导致redirect到/static/robots.txt。 (在Seans的回答中,目前还不清楚这是如何实现的。)
  • 将静态文件添加到应用程序根文件夹中并不干净
  • 最后,提出的解决scheme看起来比添加的中间件方法更清洁:

即使这是一个古老的回答问题,我正在回答这个问题,因为这个post在Google的search结果中相当高。 虽然它没有在文档中介绍,但是如果您阅读Flask Application对象构造函数的API文档 ,那么它将被覆盖。 通过传递命名参数static_folder像这样:

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

…你可以定义从哪里提供静态文件。 同样,你可以定义一个template_folder ,你的名字是static_url_path

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

发送静态文件的另一种方式是使用如下所示的全面规则:

 @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() 

我用这个试图在开发时尽量减less设置。 我从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() 

这可能是因为这个问题被添加了,但我正在通过瓶的“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。

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

dynamicWeb应用程序也需要静态文件。 这通常是CSS和JavaScript文件的来源。 理想情况下,您的Web服务器被configuration为为您服务,但在开发期间,Flask也可以这样做。 只需在你的软件包或模块旁边创build一个名为static的文件夹,它将在应用程序的/ static下可用。

要为该部分url生成url,请使用特殊的“静态”url名称:

url_for('static',filename ='style.css')

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

我也有同样的困境。 做了一些search,find我的答案(MHO):

不妨从文档中引用

dynamicWeb应用程序也需要静态文件。 这通常是CSS和JavaScript文件的来源。 理想情况下,您的Web服务器被configuration为为您服务,但在开发期间,Flask也可以这样做 。 只需在你的软件包或模块旁边创build一个名为static的文件夹,它将在应用程序的/ static下可用。

恕我直言:当你的应用程序是生产 ,静态文件服务应该(或理想情况下)在networking服务器(Nginx,Apache)configuration; 但在开发过程中 ,Flask使其可用于提供静态文件。 这是为了帮助您快速发展 – 无需安装networking服务器等。

希望能帮助到你。