有没有什么巧妙的解决方案可以将静态文件存储在 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

一定有更方便的东西:)

有帮助吗?

解决方案

,最好的方法是将 static_url_path 以根URL

from flask import Flask

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

其他提示

@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')
    })

这个例子假设你的静态文件所在的文件夹“静态”,调整为任何适合您的环境。

这个问题最干净的答案是 回答 与此(相同) 问题:

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

总结一下:

  • 正如大卫指出的,只要配置正确,它就是 可以通过 prod 提供一些静态文件
  • 查找 /robots.txt 不应导致重定向到 /static/robots.txt。(在肖恩的回答中,目前还不清楚这是如何实现的。)
  • 将静态文件添加到应用程序根文件夹中并不干净
  • 最后,建议的解决方案看起来比添加中间件方法干净得多:

尽管这是一个老问题回答,我回答这个问题,因为这个帖子在谷歌搜索结果出现相当高。虽然它不是在文档中所覆盖,如果你看过的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,名称

提供静态文件无关,与应用程序,是为了提供动态内容。提供静态文件的正确方法取决于你所使用的服务器。毕竟,当你拿到你的应用程序启动和运行,需要将其绑定到一个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()

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

另外,我用我的单机上烧瓶发展,但生产服务器与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/快速启动/#静电文件

  

动态web应用需要静态   的文件。这通常是在那里   在CSS和JavaScript文件   来自(哪里。理想的情况是你的Web服务器   被配置为他们服务你,   但在开发过程中瓶可以做   这点。只要创建一个文件夹   在你的包或下一个称为静态   你的模块,这将是   可在上/静态   应用

     

要生成的URL的那部分   URL,使用特殊的“静态”网址   名:

     

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

     

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

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

还不如从文档

引述
  

动态Web应用程序需要静态的文件。这通常是在CSS和JavaScript文件的来源。 在理想情况下您的Web服务器配置为他们服务你,但在开发过程中瓶可以做到这一点,以及。只要创建一个称为静态在你的包的旁边或模块文件夹,这将可在应用/静态的。

IMHO:当应用程序已开的生产下,静态文件服务应为(或理想地)上的网络服务器(nginx的,阿帕奇),被配置;但在发展,瓶将其提供为静态文件。这是为了帮助您快速开发 - 无需安装Web服务器和这样。

希望它帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top