はじめに
flaskで開発する際、ブラウザキャッシュが面倒だったので url_for を弄って無効化できるようにしました。
開発中 css や js が更新されずにヤキモキされてる方は、この方法を試してみてください。
キャッシュ無効化の方法
css や js を無効化する方法の1つとして、url のクエリパラメータを更新する方法があります。
この方法は「CacheBusting」と呼ばれてます(参考:古い静的ファイルを読み込ませない!Cache Bustingとは)
今回はこの仕組みをflaskに応用することで、キャッシュを無効化します。
やってみる
カスタムurl_for関数を作成
返すurlにクエリパラメータを付与する単純な関数です。
単純ですが、これがキャッシュ無効化の核になってます。
utils.py
import time
from flask import url_for
# 元のurl_forと同じ引数
def my_url_for(endpoint, **values):
url = url_for(endpoint, **values)
return url + '?ts={}'.format(int(time.time()))
jinja_envの属性(url_for)を上書き
template は url_for などの関数を利用する際、jinja_env の属性 を参照しています。
カスタムurl_for関数を実行させるために、jinja_env の url_for属性を上書きします。
application.py
from flask import Flask, render_template
from utils import my_url_for
app = Flask(__name__)
# url_forを上書き!!
app.jinja_env.globals('url_for') = my_url_for
@app.route('/')
def index():
return render_templatet('index.html')
以上で設定は終わりです。
templateでurl_forを利用
url_forは上書き前と同じように使えます。
templates/index.html
<head>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" type="text/css">
</head>