【问题标题】:With Flask, how can I serve robots.txt and sitemap.xml as static files? [duplicate]使用 Flask,我如何将 robots.txt 和 sitemap.xml 作为静态文件提供? [复制]
【发布时间】:2012-12-12 11:53:01
【问题描述】:

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

我遇到了这个piece of code,它通过模板提供站点地图。我在我的应用程序上为站点地图和 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")

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

【问题讨论】:

    标签: python flask static-files


    【解决方案1】:

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

    【讨论】:

    • 谢谢,正是我想要的。
    • 谢谢 - 这将适用于 Heroku 上的 Flask 应用程序。似乎几乎不可能让 Heroku(基于 Nginx)的路由器直接提供静态内容,除非它位于项目的 staticpublic 目录中。当然,更愿意在允许我这样做的环境中直接使用 Nginx 为 robots.txtsitemap.xml 提供服务。
    • 对我上述评论的更正:看起来 Heroku 根本不使用 Nginx,它实际上将所有请求(包括对 staticpublic 目录的请求)直接传递给应用程序进程(例如直接到 Gunicorn 获取典型的 Python 应用程序),仅通过称为 Vegur 的自定义代理/负载均衡器 - 请参阅:superuser.com/questions/837925/…
    • 谢谢,这是一个了不起的解决方案。
    【解决方案2】:

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

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

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

    默认是从/static/ 路径提供静态文件,但您希望它们从/ 提供,这样它们就在预期的位置。

    请参阅Flask API Docs 了解更多信息。

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

    【讨论】:

    • 你的意思是这样的——robots= open(cwd+'/static/robots.txt', 'r').read(),然后是robots_txt函数中的return robots
    • @elssar - 我认为你不应该重新发明文件缓存 - 查看 packages.python.org/Flask-Cache
    • @elssar 是的,这就是我的意思,但我并不是建议你真的这样做。我只是指出,如果您打算读入和输出静态文件,render_template 并没有这样做。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2012-07-14
      • 2015-10-19
      • 2014-02-22
      • 1970-01-01
      • 2023-03-06
      • 2015-11-03
      相关资源
      最近更新 更多