Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Imagens não salvam

Problema: Eu seleciono a opção "editar", escolho uma imagem, clico em salvar, clico em editar novamente e a imagem não está lá, ou seja, não atualiza. Mostrarei as 3 imagens, onde na primeira imagem eu abro o editar, na segunda imagem eu seleciono uma imagem e salvo, e na terceira imagem eu volto pra editar e a imagem que escolhi não está mais lá Clico em editar um jogoSeleciono a imagem que eu quero e salvo ! Insira aqui a descrição dessa imagem para ajudar na acessibilidade Código do views_game.py:

from flask import render_template, request, redirect, session, flash, url_for, send_from_directory
from jogoteca import app, db
from models import Jogos
from helpers import recupera_imagem, deleta_imagem
import time
from helpers import FormularioJogo

@app.route('/')
def index():
    lista = Jogos.query.order_by(Jogos.id)
    return render_template('lista.html', titulo='Jogos', jogos=lista)

@app.route('/novo')
def novo():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('novo')))
    
    form = FormularioJogo()
    return render_template('novo.html', titulo='Novo jogo', form=form)

@app.route('/criar', methods=['POST',])
def criar():
    form = FormularioJogo(request.form)

    if not form.validate_on_submit():
        return redirect(url_for('novo'))

    nome = form.nome.data
    categoria = form.categoria.data
    console = form.console.data

    existe = Jogos.query.filter_by(nome=nome).first()

    if existe:
        flash('Jogo já existente!')
        return redirect(url_for('index'))
    
    jogo = Jogos(nome=nome, categoria=categoria, console=console)
    db.session.add(jogo)
    db.session.commit()

    arquivo = request.files['arquivo']
    upload_path = app.config['UPLOAD_PATH']
    tempo = time.time()
    arquivo.save(f'{upload_path}/capa{jogo.id}-{tempo}.jpg')
    
    return redirect(url_for('index'))

@app.route('/editar/<int:id>')
def editar(id):
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('editar', id=id)))
    
    jogo = Jogos.query.filter_by(id=id).first()

    form = FormularioJogo()
    form.nome.data = jogo.nome
    form.categoria.data = jogo.categoria
    form.console.data = jogo.console

    capa_jogo = recupera_imagem(id)

    return render_template('editar.html', titulo='Editando Jogo', id=id, capa_jogo=capa_jogo, form=form)

@app.route('/atualizar', methods=['POST',])
def atualizar():
    form = FormularioJogo(request.form)

    if form.validate_on_submit():
        jogo = Jogos.query.filter_by(id=request.form['id']).first()
        jogo.nome = form.nome.data
        jogo.categoria = form.categoria.data
        jogo.console = form.console.data

        db.session.add(jogo)
        db.session.commit()

        arquivo = request.files['arquivo']
        upload_path = app.config['UPLOAD_PATH']
        tempo = time.time()
        deleta_imagem(id)
        arquivo.save(f'{upload_path}/capa{jogo.id}-{tempo}.jpg')

    return redirect(url_for('index'))

@app.route('/deletar/<int:id>')
def deletar(id):
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login'))
    
    Jogos.query.filter_by(id=id).delete()

    db.session.commit()

    flash('Jogo deletado!')

    return redirect(url_for('index'))

@app.route('/uploads/<nome_arquivo>')
def imagem(nome_arquivo):
    return send_from_directory('uploads', nome_arquivo)

app.run(debug=True)
2 respostas

Código do views.py:

import os
from jogoteca import app
from flask_wtf import FlaskForm
from wtforms import StringField, validators, SubmitField, PasswordField

class FormularioJogo(FlaskForm):
    nome = StringField('Nome do jogo', [validators.DataRequired(), validators.Length(min=1, max=50)])
    categoria = StringField('Categoria', [validators.DataRequired(), validators.Length(min=1, max=40)])
    console = StringField('Console', [validators.DataRequired(), validators.Length(min=1, max=20)])
    salvar = SubmitField('Salvar')

class FormularioUsuario(FlaskForm):
    nickname = StringField('Nickname', [validators.DataRequired(), validators.Length(min=1, max=8)])
    senha = PasswordField('Senha', [validators.DataRequired(), validators.Length(min=1, max=100)])
    login = SubmitField('Login')

def recupera_imagem(id):
    for nome_arquivo in os.listdir(app.config['UPLOAD_PATH']):
        if f'capa{id}' in nome_arquivo:
            return nome_arquivo
        return 'capa_padrao.jpg'
    
def deleta_imagem(id):
    imagem = recupera_imagem(id)
    if imagem != 'capa_padrao.jpg':
        os.remove(os.path.join(app.config['UPLOAD_PATH']), imagem)
solução!

mudou alguma coisa desde que abriu essa dúvida? https://cursos.alura.com.br/forum/topico-imagens-nao-ficam-salvas-359252

fica um pouco confuso dois tópicos iguais sabe?