web-dev-qa-db-ja.com

Flask-robot.txt、sitemap.xml(mod_wsgi)の静的ファイル

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

もっと便利なものがあるはずです:)

89
biesiad

最適な方法は、ルートURLにstatic_url_pathを設定することです

from flask import Flask

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

@vonPetrushevは正しいです。実稼働環境では、nginxまたはApacheを介して静的ファイルを提供する必要がありますが、開発のためにpython app構成の変更や複数のプロジェクトについて心配する必要はありません。これを行うには、 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')
    })

この例では、静的ファイルが「静的」フォルダーにあることを想定しており、環境に合わせて調整します。

65
Philip Southam

この質問に対する最も明確な回答は、 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:])

要約する:

  • デビッドが指摘したように、正しい設定で prodを介していくつかの静的ファイルを提供しても構いません
  • /robots.txtを検索しても、/ static/robots.txtへのリダイレクトは発生しません。 (ショーンズの回答では、それがどのように達成されたかはすぐにはわかりません。)
  • 静的ファイルをアプリのルートフォルダーに追加するのはクリーンではありません
  • 最後に、提案されたソリューションは、ミドルウェアを追加するアプローチよりもずっときれいに見えます。
56
bebbi

これは古い回答の質問ですが、この投稿はGoogleの結果でかなり高いため、私はこれに答えています。ドキュメントには記載されていませんが、Flaskアプリケーションオブジェクトコンストラクターについて 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を定義できます。

21

静的ファイルを提供することは、動的コンテンツを提供することを意図したアプリケーションとは関係ありません。静的ファイルを提供する正しい方法は、使用しているサーバーによって異なります。結局のところ、アプリを起動して実行するときは、Webサーバーにバインドする必要があります。 Apache httpdについてのみ話すことができるので、静的ファイルの提供方法は、mod-wsgiを介してアプリケーションにバインドしている仮想ホストで定義されます。サイトマップ、robots.txt、または静的コンテンツの提供方法を​​示すガイドは次のとおりです。 http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site

15
vonPetrushev

静的ファイルを送信する別の方法は、次のようなキャッチオールルールを使用することです。

@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 __== '__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()
14
Ben Golding

これはこの質問が尋ねられてから追加されたかもしれませんが、フラスコの「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が** optionsを直接send_fileに渡すものの、より制御しやすいようです。

6

こちらのドキュメントから: http://flask.pocoo.org/docs/quickstart/#static-files

動的Webアプリケーションにも静的ファイルが必要です。通常は、CSSファイルとJavaScriptファイルの元です。理想的には、Webサーバーはそれらを提供するように設定されていますが、開発中にFlaskでも同様に実行できます。パッケージ内またはモジュールの横にstaticというフォルダーを作成すると、使用可能になりますアプリケーションの/ staticで。

URLのその部分へのURLを生成するには、特別な「静的」URL名を使用します。

url_for( 'static'、filename = 'style.css')

ファイルはstatic/style.cssとしてファイルシステムに保存する必要があります。

3
Josh Klein

私も同じジレンマを抱えています。いくつかの検索を行い、私の答え(MHO)を見つけました:

ドキュメントから引用することもできます

動的Webアプリケーションにも静的ファイルが必要です。通常は、CSSファイルとJavaScriptファイルの元です。 理想的には、Webサーバーはそれらを提供するように構成されていますが、開発中にFlaskも同様に行うことができます。パッケージ内またはモジュールとアプリケーションの/ staticで利用可能になります。

私見:アプリケーションがproductionに対応している場合、静的ファイルの提供はWebサーバー(nginx、Apache)で構成する必要があります(理想的には)。しかし、開発、Flaskを使用すると、静的ファイルを提供できるようになります。これは、Webサーバーなどをセットアップする必要がないため、迅速な開発に役立ちます。

それが役に立てば幸い。

0
jpanganiban