web-dev-qa-db-ja.com

Flaskを使用して、robots.txtとsitemap.xmlを静的ファイルとして提供するにはどうすればよいですか?

静的ファイルの提供をサーバーに任せるべきであるという静かな場所をいくつか読んだことがあります。たとえば、これに関するいくつかの回答 SO質問 。しかし、私はOpenShift PaaSを使用しており、そこで.htaccessファイルを変更する方法を理解できません。

私はこれに出くわしました コードの一部 テンプレートからサイトマップを提供します。私は自分のアプリでサイトマップと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")

これに害はありますか、それとも私のアプローチは大丈夫ですか?

25
elssar

プットrobots.txtおよびsitemap.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:])
78

Flaskには、静的ファイルを提供するためのサポートが組み込まれています。

/staticディレクトリを作成し、そこにファイルを置きます。次に、Flaskをインスタンス化するときに、static_url_pathパラメーターを指定します。

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

デフォルトでは、静的ファイルは/static/パスから提供されますが、期待される場所にあるように/から提供する必要があります。

詳細については、 Flask API Docs を参照してください。

オーバーヘッドと不要なコードに加えて、アプローチの問題は、提供するファイルの1つにrender_templateのテンプレートタグのようなものが含まれている場合、レンダリングエラーが発生する可能性があることです。ファイルをメモリに読み込んで(メソッド内ではなく、一度)、render_templateを呼び出さずにその文字列を応答の本文として使用する場合は、少なくともその問題を回避できます。

9
agf

最良の方法は、static_url_pathをルートURLに設定することです。

from flask import Flask

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