質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

997閲覧

Python3.6 Flask0.12.2での画像表示

eyedrops

総合スコア8

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/02/21 15:22

編集2018/02/21 15:27

前提・実現したいこと

Pythonのflaskを使っています。アップロードした画像をローカルディレクトリのstatic/imageにtarget.jpgという名前で保存し、render_templateで用意してあるテンプレートに渡して表示したいと思っています。
コードはFlaskで画像アップローダーから拝借して少し変えています。

発生している問題・エラーメッセージ

app.run('localhost',port='8080')で実行したときは保存した画像が表示する画像に反映されているのですが、app.run()だけで実行したときにアクセスする127.0.0.1:5000では一番最初に表示した画像がそのまま残り、いくら保存する画像を変えても表示される画像が変わりませんでした。
Herokuを使って公開することを前提で作っているのでこの問題の原因、解決策があれば教えていただきたいです。

該当のソースコード

Index.py

Python

1 2from flask import Flask, render_template, request, redirect, url_for, send_from_directory, sessions 3from werkzeug.utils import secure_filename 4import sys, codecs, os 5 6sys.stdout = codecs.getwriter("utf-8")(sys.stdout) 7 8app = Flask(__name__) 9 10IMAGE_FOLDER = "./static/image/" 11ALLOWED_EXTENSIONS = {'png', 'jpg', 'gif'} 12app.config['UPLOAD_FOLDER'] = IMAGE_FOLDER 13 14def allowed_file(filename): 15 return '.' in filename and \ 16 filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 17 18 19@app.route('/static/image/<filename>') 20def uploaded_file(filename): 21 return send_from_directory(app.config['UPLOAD_FOLDER'], filename) 22 23@app.route('/') 24def upload_page(): 25 return render_template('upload.html') 26 27@app.route('/search',methods=['GET','POST']) 28def upload(): 29 if request.method == 'POST': 30 img_file = request.files['img_file'] 31 if img_file and allowed_file(img_file.filename): 32 img_file.save(os.path.join(app.config['UPLOAD_FOLDER'], 'target.jpg')) 33 # card_name = search.main() 34 img_url = url_for('static', filename='image/target.jpg') 35 36 return render_template('search.html', img_url=img_url) 37 else: 38 return ''' <p>File extension not allowed</p>''' 39 else: 40 return redirect(url_for('upload')) 41 42if __name__ == "__main__": 43 app.debug = True 44 app.run(host = "localhost",port=8080)

upload.html

html

1{% extends "base.html" %} 2{% block content %} 3<form action="/search" method="post" enctype="multipart/form-data"> 4 <input type="file" name="img_file"> 5 <div class="preview" ></div> 6 <input type="submit" value="start upload"> 7</form> 8{% if img_url %} 9<p><img src="{{ img_url }}" width="320" height="400"></p> 10{% endif %} 11{% endblock %}

base.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <link rel="stylesheet" href="/static/css/bootstrap.min.css"> 6 <title>画像表示</title> 7</head> 8<body> 9 {% block content %} 10 {% endblock %} 11</body> 12</html>

試したこと

@app.route('/static/image/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
この部分があるので試しに127.0.0.1:5000/static/image/{ファイル名}を開いたのですが、ファイル名がtarget.jpgのままだと別の画像が保存してあるにもかかわらず一番最初の画像のままでした。保存する名前を変えると保存した画像がきちんと表示されました。

補足情報(FW/ツールのバージョンなど)

Python3.6
Flask0.12.2
を使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ブラウザがキャッシュしているせいだったりしませんか。
https://stackoverflow.com/questions/45583828/python-flask-not-updating-images

投稿2018/02/22 02:55

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eyedrops

2018/02/22 03:24

ありがとうございます!画像表示うまくできました! それも考えていたのですが、まだ不勉強のためよくわからず保留にしていました。。。これからは考えられることをちゃんと調べていこうと思います!
mkgrei

2018/02/22 03:35

もしキャッシュのせいであれば、画像を保存する際に ファイル名_ハッシュ.img のように保存することで、強制的にファイル名を変化させることができます。 ハッシュとして、ユーザー・アップロード日時などを使用できます。 これだとファイルが溜まっていくので、ルールを決めて過去の画像を削除していく必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問