1
resposta

COMO RETORNA UMA IMAGEM DO FLASK_SQLALCHMY

como eu faço para pegar uma imagem do banco de dados sqlite, e retorna essa imagem em um campo img , esse e meu codigo abaixo.

CODIGO FLASK

@app.route('/editar_expedicao/<int:id>', methods = ['POST', 'GET'])
def editar_expedicao(id):
    EXP_to_update = Expedicao.query.get_or_404(id)
    if request.method == 'POST':

EXP_to_update.expedicao_image = request.files.get_file('image_1')
          db.session.commit()
        flash("Lista de expedição atualizada!", "info")
        return redirect(url_for('expedicao'))

    return render_template('editar_expedicao.html', EXP_to_update=EXP_to_update)
BOOTSTRAP CODIGO
<div class="image-preview" id="imagePreview">
                 <img src="" alt="Image Preview" class="image-preview__image" name="image_1" id="image_1">
                 <span class="image-preview__default-text">Inserir Imagem 1</span>
   </div>
1 resposta

Olá Marcelo, tudo bem com você?

Peço desculpas pela demora no retorno.

Para retornar uma imagem do Flask SQLAlchemy, primeiro você precisa certificar-se de que a imagem foi armazenada corretamente no banco de dados SQLite. Uma vez que você tenha armazenado a imagem, pode retorná-la para o usuário em uma rota diferente. Você pode criar uma rota que aceite um parâmetro id (ou qualquer outro identificador exclusivo) e, em seguida, usar o SQLAlchemy para recuperar a imagem correspondente do banco de dados.

Já para fazer o preview da imagem no momento em que o usuário seleciona o arquivo no formulário, você pode utilizar JavaScript que adicionará um escutador no evento change do input file para chamar a função previewImagem quando um arquivo é selecionado.

Segue abaixo um código completo com as características ditas acima:

from flask import Flask, render_template_string, Response, request, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.secret_key = 'coloque_uma_chave_secreta_aqui'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

class Imagens(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    imagem = db.Column(db.LargeBinary, nullable=False)

@app.route('/imagem/<int:id>')
def get_imagem(id):
    imagem = Imagens.query.filter_by(id=id).first_or_404()
    return Response(imagem.imagem, mimetype='image/jpeg')

@app.route('/cadastrar_imagem', methods=['GET', 'POST'])
def cadastrar_imagem():
    if request.method == 'POST':
        imagem = request.files['imagem'].read() # lê a imagem enviada no formulário
        nova_imagem = Imagens(imagem=imagem) # cria uma nova instância do modelo Imagens com a imagem lida
        db.session.add(nova_imagem) # adiciona a nova instância ao banco de dados
        db.session.commit() # confirma a transação
        flash("Imagem cadastrada com sucesso", "success")
        return redirect(url_for('get_imagem', id=nova_imagem.id))

    # Renderiza o template diretamente como uma string
    template = '''
    <h1>Cadastrar Imagem</h1>
    <form method="POST" enctype="multipart/form-data">
        <input type="file" name="imagem" onchange="previewImagem(event)">
        <img id="imagem-preview">
        <button type="submit">Enviar</button>
    </form>

    <script>
        function previewImagem(event) {
            const imagemPreview = document.getElementById('imagem-preview');
            imagemPreview.src = URL.createObjectURL(event.target.files[0]);
            imagemPreview.style.display = 'block';
        }
    </script>

    '''
    return render_template_string(template)

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

Espero ter ajudado. Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!