概要
@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>
まとめ
とりあえずキャッシュ使いたくない時はいいかもしれません。
今回はこの辺で。