Как вывести в html шаблон изображение(blob) во Flask
В общем, не получается вывести изображение в шаблон Flask. Сохраняется изображение в бд в blob, тип в отдельное поле. Как правильно это все сделать?
import os
from flask import Flask, Response, render_template, url_for, request, redirect, flash
from flask_sqlalchemy import SQLAlchemy
from werkzeug.utils import secure_filename
import base64
app = Flask(__name__)
app.secret_key = "super secret key"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///PR1.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
UPLOAD_FOLDER = 'static\images'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
class Profile(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=True)
surname = db.Column(db.String(20), nullable=True)
fathername = db.Column(db.String(20), nullable=True)
email = db.Column(db.String(20), nullable=True)
password = db.Column(db.String(20), nullable=True)
role = db.Column(db.String(20), nullable=True)
rep = db.Column(db.Integer, nullable=True)
date_reg = db.Column(db.String(20))
img = db.Column(db.Text)
img_name = db.Column(db.Text)
mimetype = db.Column(db.Text)
text_area = db.Column(db.String(50))
vac = db.Column(db.String, default=False)
def __repr__(self):
return '<Profile %r>' % self.id
@app.route('/profile', methods=['GET'])
def get_profile():
all_profile = Profile.query.all()
return render_template('profile.html', all_profile=all_profile)
@app.route('/profile', methods=['POST', 'GET'])
def profile():
if request.method == "POST":
name = request.form['name']
surname = request.form['surname']
fathername = request.form['fathername']
email = request.form['email']
role = request.form['role_choice'].title()
rep = request.form['rep']
date_reg = request.form['date_reg']
vac = request.form.get('vac')
text_area = request.form['text-area']
file = request.files['img']
if file and allowed_file(file.filename):
img_name = secure_filename(file.filename)
mimetype = file.mimetype
img_read = file.read()
file.save(os.path.join(app.config['UPLOAD_FOLDER'], img_name))
password = request.form['password']
password2 = request.form['password2']
if password == password2:
pass
else:
return "Пароли не совпадают"
profile_reg = Profile(date_reg=date_reg, name=name, surname=surname,
fathername=fathername, email=email,
role=role, password=password, rep=rep, text_area=text_area, vac=vac,
img=img_read, mimetype=mimetype, img_name=img_name)
try:
db.session.add(profile_reg)
db.session.commit()
return redirect('/profile')
except:
return "Ошибка"
else:
return render_template('profile.html')
@app.route('/profile/<int:id>')
def current_profile(id):
current_profile = Profile.query.get(id)
img = Profile.query.filter_by(id=id).first()
img_decode = base64.b64encode(img.img)
return render_template('current_profile.html', current_profile=current_profile, img=img_decode, mimetype=img.mimetype)
@app.route('/<int:id>')
def get_img(id):
img = Profile.query.filter_by(id=id).first()
return Response(img.img, mimetype=img.mimetype)
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
if __name__ == "__main__":
app.run(debug=True)
HTML код
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="{{url_for('static', filename='css/style.css') }}" rel="stylesheet">
<title>{{current_profile.name}}</title>
</head>
{% block body %}
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="index">ПР 1</a>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" aria-current="page" href="index">Статьи</a>
</li>
<li class="nav-item">
<a class="nav-link" href="stat">Статистика</a>
</li>
<li class="nav-item">
<a class="nav-link" href="notes">Заметки</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="profile">Анкета</a>
</li>
</ul>
</div>
</div>
</nav>
<img src="data:{{mimetype}};base64, {{img}}">
{{img.img}}
</body>
{% endblock %}
</html>