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.