I am a student. I've been trying to solve this error for hours and I can not find a way to do it:
This is the complete error:
builtins.KeyError
KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'
Traceback (most recent call last)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1994, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask\app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "D:\Disenos\Apuntes Master\Marco_Programación\apuntes_programacion\Ejercicios Flask\imdb\app.py", line 138, in signup
my_user = User.query.filter_by(email=email).first()
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask_sqlalchemy\__init__.py", line 498, in __get__
return type.query_class(mapper, session=self.sa.session())
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sqlalchemy\orm\scoping.py", line 78, in __call__
return self.registry()
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sqlalchemy\util\_collections.py", line 990, in __call__
return self.registry.setdefault(key, self.createfunc())
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sqlalchemy\orm\session.py", line 2829, in __call__
return self.class_(**local_kw)
File "C:\Users\Marco Alarcón\AppData\Local\Programs\Python\Python36-32\lib\site-packages\flask_sqlalchemy\__init__.py", line 144, in __init__
track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'
The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error.
To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.
You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:
dump() shows all variables in the frame
dump(obj) dumps all that's known about the object
Here I leave the app.py:
# -*- coding: utf-8 -*-
from flask import Flask, redirect, url_for, render_template, request, flash, session
from forms import User_form, New_movie, Search_form, Perfil_form
from models import User, db, Movie
from flask_mail import Mail, Message
import hashlib
import math
import os
import time
from werkzeug.utils import secure_filename
UPLOAD_FOLDER = 'static/img/portadas/'
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['SECRET_KEY'] = 'secret'
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_USERNAME'] = '[email protected]'
app.config['MAIL_PASSWORD'] = ''
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)
LIMITE_PELICULAS = 5
@app.route("/")
def login():
form = User_form()
if request.args.get('email') and request.args.get('password1'):
email = request.args.get('email')
password = hashlib.md5(request.args.get('password1').encode('UTF-8')).hexdigest()
my_user = User.query.filter_by(email=email, password=password).first()
if my_user:
# Existe
session['user'] = my_user.id
return redirect(url_for('dashboard'))
else:
# No Existe
flash('El usuario o contraseña no está registrado.')
return render_template('items/login.html', form=form)
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route("/peliculas/", methods=['GET', 'POST'], defaults={'pag': 1})
@app.route("/peliculas/<int:pag>", methods=['GET', 'POST'])
def dashboard(pag):
form = New_movie()
form_search = Search_form()
if request.method == 'POST':
if form.validate_on_submit():
# Movemos la imagen a staticgg
file = request.files['image']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
hora_unix = int(time.time())
ruta = str(hora_unix) + filename
file.save(os.path.join(app.config['UPLOAD_FOLDER'], ruta))
else:
flash('Debe ser una imagen.')
# Guardamos la info en la base de datos
my_movie = Movie(request.form['name'], request.form['year'], request.form['score'], ruta, session['user'])
db.session.add(my_movie)
try:
db.session.commit()
flash('Añadido correctamente', 'success')
except:
db.session.rollback()
else:
#mostramos errores
errores = form.errors.items()
for campo, mensajes in errores:
for mensaje in mensajes:
flash(mensaje, 'danger')
movies = Movie.query.limit(LIMITE_PELICULAS * pag).offset(LIMITE_PELICULAS * (pag - 1)).all()
num_movies = Movie.query.count()
num_paginas = math.ceil(num_movies / LIMITE_PELICULAS)
# Obtenemos el usuario
my_user = User.query.filter_by(id=session['user']).first()
return render_template('items/dashboard.html', form=form, movies=movies, num_paginas=num_paginas, LIMITE_PELICULAS=LIMITE_PELICULAS, form_search=form_search, user=my_user)
@app.route("/search/<ordenar>")
def search(ordenar):
movies = False
form = New_movie()
form_search = Search_form()
if ordenar == 'year':
movies = Movie.query.order_by(Movie.year)
elif ordenar == 'name':
movies = Movie.query.order_by(Movie.name)
return render_template('items/dashboard.html', movies=movies, form=form, form_search=form_search, num_paginas=0)
@app.route("/filter")
def filter():
form = New_movie()
form_search = Search_form()
name = request.args.get('name')
year = request.args.get('year')
movies = Movie.query.filter(Movie.name.like(f'%{name}%')).filter(Movie.year.like(f'%{year}%')).all()
return render_template('items/dashboard.html', movies=movies, form=form, form_search=form_search, num_paginas=0)
@app.route("/confirmar/<token>")
def confirmar(token):
my_user = User.query.filter_by(token=token).first()
if my_user:
my_user.active = True
db.session.add(my_user)
try:
flash('Su cuenta ha sido activada.', 'success')
db.session.commit()
except:
db.session.rollback()
else:
flash('Enlace caducado', 'danger')
return redirect(url_for('login'))
@app.route("/signup", methods=['GET', 'POST'])
def signup():
form = User_form()
if request.method == 'POST':
if form.validate_on_submit():
email = request.form['email']
my_user = User.query.filter_by(email=email).first()
if not my_user:
if request.form['password1'] == request.form['password2']:
my_user = User(request.form['username'], request.form['email'], request.form['password1'])
db.session.add(my_user)
try:
db.session.commit
db.session.commit()
# Envio de email
msg = Message("Hello",
sender="[email protected]",
recipients=[my_user.email])
link_token = f'http://localhost:5000/confirmar/{my_user.token}'
msg.html = render_template(
'email/confirmar.html',
link_token=link_token)
mail.send(msg)
# Informamos al usuario
flash('Le acabamos de enviar un email con las instrucciones. Gracias.', 'success')
except:
db.session.rollback()
flash('Disculpe, ha ocurrido un error.', 'danger')
return redirect(url_for('login'))
else:
flash('Los passwords no son iguales', 'danger')
else:
flash('El e-mail ya esta registrado', 'danger')
else:
# Mostramos errores
errores = form.errors.items()
for campo, mensajes in errores:
for mensaje in mensajes:
flash(mensaje, 'danger')
return render_template('items/signup.html', form=form)
@app.route("/close")
def close_session():
session.clear()
return redirect(url_for('dashboard'))
@app.route("/like/<movie>")
def add_like(movie):
movie_like = Movie.query.filter_by(id=movie).first()
movie_like.like = movie_like.like + 1
db.session.add(movie_like)
db.session.commit()
return ''
@app.route("/perfil", methods=['GET', 'POST'])
def perfil():
form = Perfil_form()
my_user = User.query.filter_by(id=session['user']).first()
if request.method == 'POST':
# Comprobamos si desean cambiar la contraseña
if request.form['password_anterior'] and request.form['password_nueva']:
# Comprobamos que la contraseña anterior es igual a la que ya estaba
if hashlib.md5(request.form['password_anterior'].encode('utf-8')).hexdigest() == my_user.password:
# Modificamos
my_user.password = hashlib.md5(request.form['password_nueva'].encode('utf-8')).hexdigest()
db.session.add(my_user)
try:
db.session.commit()
flash('Su contraseña ha sido modificada correctamente', 'success')
except:
db.session.rollback()
else:
flash('Su contraseña anterior no es igual. ¿Eres tú?', 'danger')
# Cambiar el username
my_user.username = request.form['username']
db.session.add(my_user)
try:
db.session.commit()
except:
db.session.rollback()
return render_template('items/perfil.html', form=form, user=my_user)
if __name__ == "__main__":
app.debug = True
app.run()
Here the Models.py
import time
import hashlib
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root@localhost/imdb'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100))
email = db.Column(db.String(80), unique=True)
password = db.Column(db.String(32))
avatar = db.Column(db.String(500))
active = db.Column(db.Boolean())
token = db.Column(db.String(32))
movie = db.relationship('Movie', backref='user',
lazy='dynamic')
def __init__(self, username, email, password):
self.username = username
self.email = email
self.avatar = 'img/avatars/default.gif'
self.password = hashlib.md5(password.encode('utf-8')).hexdigest()
self.active = False
self.token = hashlib.md5(str(time.time()).encode('utf-8')).hexdigest()
def __repr__(self):
return '<User %r>' % self.username
class Movie(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
year = db.Column(db.Integer)
image = db.Column(db.String(500))
score = db.Column(db.Integer)
like = db.Column(db.Integer)
id_user = db.Column(db.Integer, db.ForeignKey('user.id'))
def __init__(self, name, year, score, ruta, id_user):
self.name = name
self.year = year
self.score = score
self.image = ruta
self.like = 0
self.id_user = id_user
def __repr__(self):
return '<Movies %r>' % self.name