Flask の静的ファイル配信と url_for

Flask で CSS や JavaScript、画像などの静的ファイルを配信するには、static ディレクトリにファイルを配置する。デフォルトでは /static/ パスでアクセスできる。

ディレクトリ構成

プロジェクトのディレクトリ構成は以下のようになる。

myapp/
├── app.py
├── static/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── main.js
│   └── images/
│       └── logo.png
└── templates/
    └── index.html

static ディレクトリ以下のファイルは、そのまま /static/css/style.css などの URL でアクセスできる。

url_for による URL 生成

テンプレート内で静的ファイルを参照するときは url_for 関数を使う。

<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
<img src="{{ url_for('static', filename='images/logo.png') }}" alt="Logo">

url_for('static', filename='...') とすると、Flask が適切な URL を生成する。パスをハードコードするより保守性が高い。

ルーティングでの url_for

url_for は静的ファイルだけでなく、ルーティングの URL 生成にも使える。

from flask import Flask, url_for, redirect

app = Flask(__name__)

@app.route('/')
def index():
    return 'Index'

@app.route('/login')
def login():
    return redirect(url_for('index'))

url_for('index') は関数名 index に対応する URL(この場合は /)を返す。URL を変更してもコードの修正箇所が減るため、リダイレクトやリンク生成には url_for を使うのが推奨される。