1
resposta

[Bug] Erro ao acessar a página de index "/"

Antes meu código estava dando erro pois o Flask-SQLAlchemy estava na versão 2.5.1 e seguindo as orientações de outros foruns atualizei ele para a versão 3.0.3

Agora, eu consigo rodar o código, mas ao tentar entrar no endereço raiz do site é levantado o seguinte erro:

sqlalchemy.exc.InterfaceError: (mysql.connector.errors.InterfaceError) 2003: Can't connect to MySQL server on '%-.100s:%u' (%s) (Warning: %u format: a real number is required, not str)
(Background on this error at: https://sqlalche.me/e/20/rvf5)

Segue o código completo do arquivo jogoteca.py

from flask import Flask, render_template, request, redirect, session, flash, url_for
from flask_sqlalchemy import SQLAlchemy

from dotenv import dotenv_values

app = Flask(__name__)
app.secret_key = 'alura'

app.config['SQLALCHEMY_DATABASE_URI'] = \
    '{SGBD}://{usuario}:{senha}@{servidor}/{database}'.format(
        SGBD = 'mysql+mysqlconnector',
        usuario = dotenv_values()['USUARIO'],
        senha = dotenv_values()['SENHA'],
        servidor = dotenv_values()['SERVIDOR'],
        database = 'jogoteca'
    )

db = SQLAlchemy(app)

class Jogos(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    nome = db.Column(db.String(50), nullable=False)
    categoria = db.Column(db.String(40), nullable=False)
    console = db.Column(db.String(20), nullable=False)


class Usuarios(db.Model):
    nickname = db.Column(db.String(8), primary_key=True)
    nome = db.Column(db.String(20), nullable=False)
    senha = db.Column(db.String(100), nullable=False)

@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')))
    return render_template('novo.html', titulo='Novo Jogo')

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

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

    if jogo:
        flash('Jogo já existente!')
        return redirect(url_for('index'))

    novo_jogo = Jogos(nome=nome, categoria=categoria, console=console)
    db.session.add(novo_jogo)
    db.session.commit()

    return redirect(url_for('index'))

@app.route('/login')
def login():
    proxima = request.args.get('proxima')
    return render_template('login.html', proxima=proxima)

@app.route('/autenticar', methods=['POST',])
def autenticar():
    usuario = Usuarios.query.filter_by(nickname=request.form['usuario']).first()
    if usuario:
        if request.form['senha'] == usuario.senha:
            session['usuario_logado'] = usuario.nickname
            flash(usuario.nickname + ' logado com sucesso!')
            proxima_pagina = request.form['proxima']
            return redirect(proxima_pagina)
    else:
        flash('Usuário não logado.')
        return redirect(url_for('login'))

@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Logout efetuado com sucesso!')
    return redirect(url_for('index'))

app.run(debug=True)

Segue abaixo as versões das bibliotecas que estou usando:

bcrypt                 4.0.1
blinker                1.6.2
click                  8.1.3
Flask                  2.3.2
Flask-Bcrypt           1.0.1
Flask-SQLAlchemy       3.0.3
Flask-WTF              1.1.1
greenlet               2.0.2
importlib-metadata     6.6.0
itsdangerous           2.1.2
Jinja2                 3.1.2
MarkupSafe             2.1.2
mysql-connector-python 8.0.28
pip                    23.1.2
protobuf               4.23.1
python-dotenv          1.0.0
setuptools             67.7.2
SQLAlchemy             2.0.15
typing_extensions      4.5.0
Werkzeug               2.3.4
wheel                  0.40.0
WTForms                3.0.1
zipp                   3.15.0

Já busquei a resolução desse erro mas nada serviu para mim.

1 resposta

Olá Lucas! Tudo certo? Espero que sim. 🙂

Primeiramente, recomendo sempre a utilização de versões de bibliotecas e pacotes utilzadas no curso. Isso garante que não haverá nenhum erro de compatibilidade ao decorrer do projeto.

Esse erro me parece ser algo referente à conexão com o server do MySQL. Sugiro que faça um teste colocando as informações de logon no servidor de forma hard-coded, substituindo o uso do dotenv. Isso vai indicar se o problema seria com a utilização do dotenv ou com a instalação/criação/conexão do banco de dados. Caso o problema persista nesse teste, sugiro reinstalar o MySQL, porém, caso o acesso seja bem sucedido, entao o problema está na forma como você está guardando esses dados sensíveis no documento de senhas.

Espero ter ajudado! Quaisquer dúvidas, estou à disposição. 😉

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