什么触发 KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'?

时间:2021-07-07 10:15:22

标签: python flask sqlalchemy flask-sqlalchemy

我已经查看了有关此错误的其他线程,它们都表明此错误是由于“app = Flask(name)”的多个实例造成的。但是因为我只有一个,我希望这里有人能帮我解决这个问题。

我尽量保持代码最少,但足以重现错误

routes.py:

from flask import Flask, render_template, request, session, redirect, url_for
from models import db, User, Events, Bookings
from forms import SignupForm
from datetime import datetime, time

app = Flask(__name__)


app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://link'


app.secret_key = "secret"


@app.route("/register", methods=['GET', 'POST'])
def signup():
    form = SignupForm()
    
    if request.method == 'POST':
        if form.validate() == False:
            return render_template('register.html', form=form)
        else:
            username = form.username.data
            email = form.email.data
            role = 'user'
            confirmed = True
            created_on = datetime.now()
            password = form.password.data
            newuser = User(username, email, role, confirmed, created_on, password)
            db.session.add(newuser)
            db.session.commit()
    elif request.method == 'GET':
        return render_template('register.html', form=form)
        
if __name__ == '__main__':
    app.run(debug=True)

models.py:

from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash


db = SQLAlchemy()


class User(db.Model):
    __tablename__ = 'users'
    uid = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(100), unique=True)
    email = db.Column(db.String(100), unique=True)
    role = db.Column(db.String(20), nullable=False)
    confirmed = db.Column(db.Boolean, nullable=False, default=False)
    created_on = db.Column(db.DateTime, nullable=False)
    pwdhash = db.Column(db.String(66), nullable=False)

    def __init__(self, username, email, role, confirmed, created_on, password):
        self.username = username
        self.email = email
        self.role = role
        self.confirmed = confirmed
        self.created_on = created_on
        self.set_password(password)

    def set_password(self, password):
        self.pwdhash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.pwdhash, password)

为 Postgres 数据库创建语句:

CREATE TABLE users (
    uid serial PRIMARY KEY UNIQUE NOT NULL,
    username VARCHAR ( 50 ) UNIQUE NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    role VARCHAR ( 50 ) NOT NULL,
    confirmed BOOLEAN NOT NULL,
    created_on TIMESTAMPTZ NOT NULL,
    pwdhash VARCHAR ( 66 ) NOT NULL
);

编辑:这是错误日志:

File "C:\Users\LuMi\crossfit\test.py", line 30, in signup
            role = 'user'
            confirmed = True
            created_on = datetime.now()
            password = form.password.data
            newuser = User(username, email, role, confirmed, created_on, password)
            db.session.add(newuser)Open an interactive python shell in this frame
            db.session.commit()
    elif request.method == 'GET':
        return render_template('register.html', form=form)
 
if __name__ == '__main__':
File "<string>", line 2, in add
 
File "C:\Users\LuMi\crossfit\venv\Lib\site-packages\sqlalchemy\orm\scoping.py", line 23, in _proxied
return self.registry()
File "C:\Users\LuMi\crossfit\venv\Lib\site-packages\sqlalchemy\util\_collections.py", line 1010, in __call__
return self.registry.setdefault(key, self.createfunc())
File "C:\Users\LuMi\crossfit\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 4101, in __call__
return self.class_(**local_kw)
File "C:\Users\LuMi\crossfit\venv\Lib\site-packages\flask_sqlalchemy\__init__.py", line 175, in __init__
track_modifications = app.config['SQLALCHEMY_TRACK_MODIFICATIONS']
KeyError: 'SQLALCHEMY_TRACK_MODIFICATIONS'

1 个答案:

答案 0 :(得分:1)

您需要重构代码。

dotnet restore 中删除 flask_sqlalchemy 导入并将其添加到 models.py

把这一行放在 app.route(/register)....

routes.py

从models.py 中删除from models import db, User, Events, Bookings 并添加此导入语句

db = SQLAlchemy()

最后包括这一行

from routes import db 

低于db = SQLAlchemy(app)