0
0

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 1 year has passed since last update.

flask で画像ファイルをstatic から読み込むときにキャッシュを使わない方法

Last updated at Posted at 2022-05-30

概要

@kenmaro
です。

備忘録となります。

やりたいこと

  • flask 側でそのimgをユーザのPOSTなどに応じて毎回作り替えている
  • flaskはできたimgをstatic フォルダに格納する
  • html 側でstatic に保存された画像に対して、img タグを使って画像をレンダリングしている

という状況で、ブラウザ上で確認すると、
static/
以下の画像は毎回更新されているにもかかわらず、
ブラウザ上では画像が更新されなかったので、あれ?となりました。

キャッシュを使わないような設定にすることで、毎回画像をstatic フォルダからレンダリングしてもらうことで解決しようとした、
というだけの記事です。

TLDR

app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

をつければいけました。

3分でできる再現の仕方

flask を使ういつものフォルダ構成をします。

test.py
static
templates/first.html
         /second.html
test.py
from flask import Flask, render_template, request
import numpy as np
import pandas as pd
import os
import matplotlib
import time
matplotlib.use('agg')

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

from flask import url_for


@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("first.html")
    else:
        num = int(request.form["num"])
        tmp = (np.random.rand(num)*100).tolist()
        tmp2 = map(int, tmp)
        df = pd.DataFrame(tmp2, columns=["age"])
        df.plot.hist(bins=5).figure.savefig('static/tmp.png')

        print(os.getcwd())
        print(df.head)
        return render_template("second.html")



if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8000)
templates/first.html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    this is the main page
    
    <form action="/" method="post">
        <div>
            <label for="name">number</label>
            <input type="number" id="num" name="num">
        </div>
        <input type="submit" value="send">
    </form>
    </body>
</html>
templates/second.html
<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" type="text/css">
      </head>
    <body>
    this is the main page
    <img src="static/tmp.png" alt="">

    <a href="/">back</a>
    </body>
</html>

まとめ

とりあえずキャッシュ使いたくない時はいいかもしれません。

今回はこの辺で。

@kenmaro

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?