頭の中は異空間

ものづくり中心

【Django】ローカルでキャッシュバスティングをして、staticファイルを即時反映させよう

もうwebで開発をするのなら当たり前ですがjsやcssの修正を反映させるにはキャッシュをどうにかしないといけません。
Django初心者の私が軽く調べてみたところ、Djangoには最初からその機能が備わっているとのこと。
blog.xoxzo.com
Djangoでは本番にデプロイするときに一箇所にstaticファイルを集める仕様になっており、そのときに機能する機能(激寒ギャグ)ということだと思います。じゃあローカルではどうやるのと。

django-static-md5urlを使ってみたところローカルだとどうもうまく機能してくれないので、仕方なくキャッシュバスティングの部分は自作することにしました。
早速コードから。


views.py

import random, hashlib

これも同じくviews.pyに

def get(self, request, *args, **kwargs):
    ...
    hash = hashlib.sha256(str(random.random()).encode()).hexdigest()
    ...
    return render(request, 'myapp/index.html', {'form': form, 'hash': hash})

hash値を保存し、
sha256の部分はお好みで(sha224, sha512など。値の長さが違ったりするけど)。

{% block extrahead %}
    <link href="{% static 'myapp/css/app.css' %}?v={{ hash }}" rel="stylesheet" type="text/css">
    <script type="text/javascript" src="{% static 'myapp/js/app.js' %}?v={{ hash }}"></script>
{% endblock %}

こんな感じで書けば?v=の先が毎回ランダムなhash値となり、十分なhashの長さならhashの衝突もまず起こらないので不自由なく修正直後に反映させることができます。