我已经查看了有关此错误的其他线程,它们都表明此错误是由于“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'
答案 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)