0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Flask] 静的ファイルのキャッシュを無効化する

Last updated at Posted at 2021-02-12

はじめに

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>

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?