Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Flaskで静的ファイル(javascript、css)のファイル更新で反映されない

先日作成した動画再生アプリ作成しました。
elsammit-beginnerblg.hatenablog.com

この際Flaskを用いたのですが、javascriptcssを変更しても表示上変更されずに苦労したので、対策を備忘録として残しておこうと思います。
f:id:Elsammit:20210510221324p:plain



■現象

javascriptcssを変更しても表示上変化しない。
ブラウザキャッシュが原因で、ブラウザキャッシュをクリアすれば変更後の状態が反映される。
ファイル変更後の動作確認時毎回ブラウザキャッシュしなければならなくなるのでとても面倒。

■対処方法

どうやらHTML内でcssをリンクする際に、

style.css?v=12

のように更新日時やバージョンを付け加えればキャッシュがクリアされ、
変更が反映されるようです。

しかし、、、
いちいち手動で設定するのが面倒だな。。。
と思い調べてみたところ、下記を発見!!

内容としてはファイル更新した旨を示す情報をファイルに埋め込むことで対応するようです。
具体的には下記のようなコードをFlaskのコードに埋め込めばOKのよう。

@app.context_processor
def override_url_for():
    return dict(url_for=dated_url_for)

def dated_url_for(endpoint, **values):
    if endpoint == 'static':
        filename = values.get('filename', None)
        if filename:
            file_path = os.path.join(app.root_path,
                                     endpoint, filename)
            values['q'] = int(os.stat(file_path).st_mtime)
    return url_for(endpoint, **values)

早速入れ込んで動作検証実施。
確かにこちらのコードで問題なくcssjavascriptの変更に追従して表示も変わっていたことを確認!!

無事に解決。

■最後に

今回は短いですが以上になります。
Flaskだとjavascriptcssが静的ファイルとして扱われるのでこのような仕様なのでしょうか??
少し面倒な仕様だな、と感じてしまった。。