使用Flask,我如何将robots.txt和sitemap.xml作为静态文件提供?

时间:2012-12-27 02:44:09

标签: python flask static-files

我已经安静地阅读了一些提供静态文件的地方应该留给服务器,例如在SO question的几个答案中。但我使用的是OpenShift PaaS,无法弄清楚如何在那里修改.htaccess文件。

我遇到了这个从模板提供站点地图的piece of code。我在我的应用上为sitemap和robots.txt做了这样的事情,就像这样 -

@app.route("/sitemap.xml")
def sitemap_xml():
    response= make_response(render_template("sitemap.xml"))
    response.headers['Content-Type'] = 'application/xml'
    return response

@app.route("/robots.txt")
def robots_txt():
    return render_template("robots.txt")

这有什么害处,还是我的方法还可以?

3 个答案:

答案 0 :(得分:73)

robots.txtsitemap.xml放入应用的static目录并定义此视图:

from flask import Flask, request, send_from_directory

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

答案 1 :(得分:8)

Flask内置支持提供静态文件。

创建一个/static目录并将您的文件放在那里。然后,当您实例化Flask时,请指定static_url_path参数:

app = Flask(__name__, static_url_path='/')

默认设置是从/static/路径提供静态文件,但您希望它们从/提供,以便它们符合预期。

有关详细信息,请参阅Flask API Docs

除了开销和不必要的代码之外,您的方法的问题是,如果/当您要提供的某个文件包含的内容看起来像render_template的模板标记时 - 您可能会导致呈现错误。如果你要将文件读入内存(一次,不在方法内),那么使用该字符串作为响应的主体而不调用render_template,你至少可以避免这个问题。

答案 2 :(得分:2)

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

from flask import Flask

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