builtins.KeyError KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS' (Flask-python)

0

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
    
asked by Dinfecs 24.03.2017 в 19:15
source

1 answer

1

It is a bug in the flask-sqlachemy library in version 2.2

Install the previous version and fix it.

For python3

pip3 install flask_sqlalchemy==2.1

or for python2

pip install flask_sqlalchemy==2.1
    
answered by 11.05.2017 / 13:50
source