[解決済み] Flaskで静的ファイルを提供する方法
2022-03-14 14:08:33
質問
というわけで、お恥ずかしい話ですが。で作ったアプリケーションを
Flask
で、今のところ、CSSとJSへのいくつかのリンクを持つ単一の静的なHTMLページを提供しているだけです。そして、ドキュメントのどこを探しても
Flask
は、静的ファイルを返すことを説明しています。はい、私は
render_template
が、データがテンプレ化されていないことは分かっている。と思っていたら
send_file
または
url_for
が正解だったのですが、それらがうまくいかなかったのです。とりあえず、ファイルを開いて内容を読み、リギングしているところです。
Response
を適切なmimetypeで表示します。
import os.path
from flask import Flask, Response
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: no cover
return os.path.abspath(os.path.dirname(__file__))
def get_file(filename): # pragma: no cover
try:
src = os.path.join(root_dir(), filename)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
return open(src).read()
except IOError as exc:
return str(exc)
@app.route('/', methods=['GET'])
def metrics(): # pragma: no cover
content = get_file('jenkins_analytics.html')
return Response(content, mimetype="text/html")
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_resource(path): # pragma: no cover
mimetypes = {
".css": "text/css",
".html": "text/html",
".js": "application/javascript",
}
complete_path = os.path.join(root_dir(), path)
ext = os.path.splitext(path)[1]
mimetype = mimetypes.get(ext, "text/html")
content = get_file(complete_path)
return Response(content, mimetype=mimetype)
if __name__ == '__main__': # pragma: no cover
app.run(port=80)
誰かこれのコードサンプルかURLを教えてください。私はこれが死んで簡単になるだろう知っている。
どのように解決するのですか?
静的ファイルの配信には、NGINX などの Web サーバを使用するのが好ましいでしょう。
ただし
send_from_directory
を使えば、ディレクトリからファイルを送信することができますので、状況によってはかなり便利です。
from flask import Flask, request, send_from_directory
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')
@app.route('/js/<path:path>')
def send_js(path):
return send_from_directory('js', path)
if __name__ == "__main__":
app.run()
あるいは
app.send_file
または
app.send_static_file
が、これは
非常に非推奨
ユーザが提供するパスでセキュリティリスクを引き起こす可能性があるからです。
send_from_directory
は、そのようなリスクをコントロールするために設計されました。
関連
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] Pythonの静的メソッド?
-
[解決済み] Flaskのリクエストで受信したデータを取得する
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python jiabaライブラリの使用方法について説明
-
python implement mysql add delete check change サンプルコード
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み] アプリケーションが .css ファイルを拾わない(flask/python) [重複]。
-
[解決済み] flaskのレスポンスで画像を返すには?[重複している]。