質問

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

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

役に立ちましたか?

解決

最善の方法は、ルートURL

への static_url_path のセットにあります
from flask import Flask

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

他のヒント

@vonPetrushevは右、生産にあなたはnginxのまたはApache経由で静的ファイルを提供したいと思うが、開発のためにそれの素敵なあなたのdevの環境の単純なあなたがいないので、静的なコンテンツを提供するだけでなく、あなたの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 へのリダイレクトは発生しません。(ショーンの答えでは、それがどのように達成されるかはすぐには明らかではありません。)
  • アプリのルートフォルダーに静的ファイルを追加するのはクリーンではありません
  • 最後に、提案されたソリューションは、ミドルウェアを追加するアプローチよりもはるかにクリーンに見えます。
この記事は、Googleの検索結果ではかなり高いアップしますので、

これは古い答えた質問ですが、私はこれに答えています。それはドキュメントに記載されていないですが、あなたが読めば 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サーバーにバインドする必要があります。静的なファイルを提供する方法は、あなたはMOD-WSGIを通して、あなたのアプリケーションに結合されていることを仮想ホストに定義されているので、私は、Apacheのみのhttpdのために話すことができます。ここでは、サイトマップ、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/するからアイデアを得ました

さらに、私は、スタンドアロンのマシン上でフラスコを使用して開発するが、運用サーバに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を使用します   名前:

     

なurl_for( '静的'、   ファイル名= 'のstyle.css')

     

ファイルは、上に格納する必要があります   静的/ style.cssにとしてファイルシステムます。

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

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

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

私見では:申請が完了したら 生産, 、静的ファイルの提供は Web サーバー (nginx、Apache) 上で構成する必要があります (または理想的には)。しかしその間に 発達, Flask は静的ファイルを提供できるようにしました。これは、Web サーバーなどをセットアップする必要がなく、迅速に開発できるようにするためです。

それが役に立てば幸い。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top