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

时间:2010-11-21 19:27:00

标签: python flask static mod-wsgi robots.txt

是否有任何聪明的解决方案可以在Flask的应用程序根目录中存储静态文件。 robots.txt和sitemap.xml应该在/中找到,所以我的想法是为它们创建路径:

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

必须有更方便的东西:)

10 个答案:

答案 0 :(得分:71)

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

from flask import Flask

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

答案 1 :(得分:65)

@vonPetrushev是对的,在制作中你需要通过nginx或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')
    })

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

答案 2 :(得分:56)

这个问题最干净的答案是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的回答中,并不是很清楚这是如何实现的。)
  • 将静态文件添加到应用程序根文件夹
  • 并不干净
  • 最后,建议的解决方案看起来比添加中间件方法更清晰:

答案 3 :(得分:21)

即使这是一个陈旧的回答问题,我也在回答这个问题,因为这篇文章在Google搜索结果中显得相当高。虽然文档中没有介绍它,但是如果您阅读了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的名称。

答案 4 :(得分:15)

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

答案 5 :(得分:13)

发送静态文件的另一种方法是使用像这样的catch-all规则:

@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/

得到了这个想法

此外,我正在使用独立计算机上的flask进行开发,但在生产服务器中使用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()

答案 6 :(得分:6)

自从提出这个问题以来,这可能已被添加,但我正在查看flask的“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。

答案 7 :(得分:3)

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

  

动态Web应用程序需要静态   文件也是如此。那通常是在哪里   CSS和JavaScript文件是   来自(哪里。理想情况下您的Web服务器   配置为您服务,   但在开发过程中Flask可以做到   那也是。只需创建一个文件夹   在您的包或下一个中称为静态   到你的模块,它将是   在/ static上可用   应用

     

生成指向该部分的网址   URL,使用特殊的“静态”URL   名:

     

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

     

该文件必须存储在   filesystem as static / style.css。

答案 8 :(得分:0)

我也有同样的困境。做了一些搜索并找到了答案(MHO):

不妨引用文档

  

动态Web应用程序也需要静态文件。这通常是CSS和JavaScript文件的来源。 理想情况下,您的网络服务器已配置为为您服务,但在开发过程中,Flask也可以这样做。只需在包中或模块旁边创建一个名为static的文件夹,它就可以在应用程序的/ static中找到。

恕我直言:当您的应用程序用于生产时,应在Web服务器(nginx,apache)上配置(或理想情况下)静态文件服务;但在开发期间,Flask可以提供静态文件。这是为了帮助您快速发展 - 无需设置Web服务器等。

希望它有所帮助。

答案 9 :(得分:0)

尝试一下:

@app.route("/ProtectedFolder/<path:filename>")
@CheckUserSecurityAccessConditions
def Protect_Content(filename):
  return send_from_directory((os.path.join(os.path.dirname(__file__), 'ProtectedFolder')),filename)