Flask で静的ファイルを提供する方法
P粉754473468
2023-08-23 15:50:41
<p>これは恥ずかしいことです。 <code>Flask</code> でアプリを作成しましたが、現在は CSS と JS へのリンクを含む静的な HTML ページを提供するだけです。 <code>Flask</code> のドキュメントに、静的ファイルを返す方法について説明している場所が見つかりません。はい、<code>render_template</code> は使用できますが、データがテンプレート化されていないことがわかっています。 <code>send_file</code> または <code>url_for</code> は正しいと思いますが、それらを機能させることができません。その間に、ファイルを開いて内容を読み取り、適切な MIME タイプを使用して <code>Response</code> を設定します: </p>
<pre class="brush:php;toolbar:false;">os.path をインポート
from flask import Flask、応答
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # プラグマ: カバーなし
return os.path.abspath(os.path.dirname(__file__))
def get_file(ファイル名): # プラグマ: カバーなし
試す:
src = os.path.join(root_dir(), ファイル名)
# flask が静的ファイルを返す方法を理解する
#試してみた:
# - render_template
# - ファイルを送信
# これはそれほど自明ではないはずです
open(src).read() を返す
IOError を除く exc:
str(exc)を返す
@app.route('/',methods=['GET'])
def metrics(): # プラグマ: カバーなし
content = get_file('jenkins_analytics.html')
return Response(content, mimetype="text/html")
@app.route('/', デフォルト={'パス': ''})
@app.route('/<パス:パス>')
def get_resource(path): # プラグマ: カバーなし
MIME タイプ = {
".css": "テキスト/css",
".html": "テキスト/html",
".js": "アプリケーション/JavaScript",
}
complete_path = os.path.join(root_dir(), path)
ext = os.path.splitext(パス)[1]
mimetype = mimetypes.get(ext, "text/html")
コンテンツ = get_file(完全なパス)
return Response(コンテンツ、mimetype=mimetype)
if __name__ == '__main__': # プラグマ: カバーなし
app.run(port=80)</pre>
<p>これのコード サンプルまたは URL を提供したい人はいますか?それはとても簡単なことだとわかっていました。 </p>
静的ファイルの場所を移動したいだけの場合、最も簡単な方法はコンストラクターでパスを宣言することです。以下の例では、テンプレートと静的ファイルを
リーリーweb
というサブフォルダーに移動しました。static_url_path=''
URL から先行するパスをすべて削除します。static_folder='web/static'
フォルダー内で見つかったすべてのファイルを提供しますweb/static
静的ファイルとして。template_folder='web/templates'
同様に、これも変更されます テンプレートフォルダー。このメソッドを使用すると、次の URL から CSS ファイルが返されます:
リーリー最後に、フォルダー構造のスナップショットを示します。
flask_server.py
は Flask インスタンスです。運用環境では、静的フォルダーからの
/static
リクエストを処理するようにアプリケーションの前に HTTP サーバー (Nginx、Apache など) を構成します。専用 Web サーバーは、静的ファイルを効率的に提供するのに非常に優れていますが、容量が少ない場合は Flask と比べて違いに気づかないかもしれません。Flask は、Flask アプリケーションを定義する Python モジュールの隣の
static フォルダーの下に任意の
filenameを提供する
/static/ルートを自動的に作成します。 。静的ファイルにリンクするには、
url_for
を使用します:url_for('static', filename='js/analytics.js')
send_from_directory
を使用して、独自のルートのディレクトリからファイルを提供することもできます。これはベース ディレクトリとパスを取得し、ユーザーが指定したパスを安全に受け入れることができるように、パスがそのディレクトリ内に含まれていることを確認します。これは、ログインしているユーザーに権限があるかどうかなど、ファイルを提供する前に何かを確認したい場合に便利です。 リーリー
#send_file または
ファイル システムに書き込まずにメモリ内にファイルを生成している場合は、
BytesIOsend_static_file
をユーザー指定のパスとともに使用しないでください。これにより、ディレクトリ トラバーサル攻撃
にさらされることになります。 send_from_directory 既知のディレクトリへのユーザー指定のパスを安全に処理するように設計されており、パスがディレクトリをエスケープしようとするとエラーが発生します。オブジェクトを
send_file## に渡すことで、ファイルとして提供できます。 # 。この場合、ファイル名やコンテンツ タイプなどを推測できないため、追加のパラメータを
send_file
に渡す必要があります。