I already looked at other threads concerning this error, which all indicate that this error is due to multiple instances of “app = Flask(name)”. But since I only have one, I hope someone here can help me figure this one out.
I try to keep the code minimal, but enough to reproduce the error
routes.py:
JavaScript
x
37
37
1
from flask import Flask, render_template, request, session, redirect, url_for
2
from models import db, User, Events, Bookings
3
from forms import SignupForm
4
from datetime import datetime, time
5
6
app = Flask(__name__)
7
8
9
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://link'
10
11
12
app.secret_key = "secret"
13
14
15
@app.route("/register", methods=['GET', 'POST'])
16
def signup():
17
form = SignupForm()
18
19
if request.method == 'POST':
20
if form.validate() == False:
21
return render_template('register.html', form=form)
22
else:
23
username = form.username.data
24
email = form.email.data
25
role = 'user'
26
confirmed = True
27
created_on = datetime.now()
28
password = form.password.data
29
newuser = User(username, email, role, confirmed, created_on, password)
30
db.session.add(newuser)
31
db.session.commit()
32
elif request.method == 'GET':
33
return render_template('register.html', form=form)
34
35
if __name__ == '__main__':
36
app.run(debug=True)
37
models.py:
JavaScript
1
31
31
1
from flask_sqlalchemy import SQLAlchemy
2
from werkzeug.security import generate_password_hash, check_password_hash
3
4
5
db = SQLAlchemy()
6
7
8
class User(db.Model):
9
__tablename__ = 'users'
10
uid = db.Column(db.Integer, primary_key = True)
11
username = db.Column(db.String(100), unique=True)
12
email = db.Column(db.String(100), unique=True)
13
role = db.Column(db.String(20), nullable=False)
14
confirmed = db.Column(db.Boolean, nullable=False, default=False)
15
created_on = db.Column(db.DateTime, nullable=False)
16
pwdhash = db.Column(db.String(66), nullable=False)
17
18
def __init__(self, username, email, role, confirmed, created_on, password):
19
self.username = username
20
self.email = email
21
self.role = role
22
self.confirmed = confirmed
23
self.created_on = created_on
24
self.set_password(password)
25
26
def set_password(self, password):
27
self.pwdhash = generate_password_hash(password)
28
29
def check_password(self, password):
30
return check_password_hash(self.pwdhash, password)
31
create statements for the Postgres Database:
JavaScript
1
10
10
1
CREATE TABLE users (
2
uid serial PRIMARY KEY UNIQUE NOT NULL,
3
username VARCHAR ( 50 ) UNIQUE NOT NULL,
4
email VARCHAR ( 255 ) UNIQUE NOT NULL,
5
role VARCHAR ( 50 ) NOT NULL,
6
confirmed BOOLEAN NOT NULL,
7
created_on TIMESTAMPTZ NOT NULL,
8
pwdhash VARCHAR ( 66 ) NOT NULL
9
);
10
EDIT: THIS IS THE ERROR LOG:
JavaScript
1
24
24
1
File "C:UsersLuMicrossfittest.py", line 30, in signup
2
role = 'user'
3
confirmed = True
4
created_on = datetime.now()
5
password = form.password.data
6
newuser = User(username, email, role, confirmed, created_on, password)
7
db.session.add(newuser)Open an interactive python shell in this frame
8
db.session.commit()
9
elif request.method == 'GET':
10
return render_template('register.html', form=form)
11
12
if __name__ == '__main__':
13
File "<string>", line 2, in add
14
15
File "C:UsersLuMicrossfitvenvLibsite-packagessqlalchemyormscoping.py", line 23, in _proxied
16
return self.registry()
17
File "C:UsersLuMicrossfitvenvLibsite-packagessqlalchemyutil_collections.py", line 1010, in __call__
18
return self.registry.setdefault(key, self.createfunc())
19
File "C:UsersLuMicrossfitvenvLibsite-packagessqlalchemyormsession.py", line 4101, in __call__
20
return self.class_(**local_kw)
21
File "C:UsersLuMicrossfitvenvLibsite-packagesflask_sqlalchemy__init__.py", line 175, in __init__
22
track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
23
KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'
24
Advertisement
Answer
You need to restructure your code.
remove the flask_sqlalchemy
import from models.py
and add it in routes.py
bring this line just before app.route(/register)….
JavaScript
1
2
1
from models import db, User, Events, Bookings
2
remove db = SQLAlchemy()
this from models.py and add this import statement
JavaScript
1
2
1
from routes import db
2
and finally include this line
JavaScript
1
2
1
db = SQLAlchemy(app)
2
below app.secret_key = "secret"