为什么我的代码中的实例没有添加到我的数据库中?



我正在使用Python和Flask构建一个简单的应用程序,允许用户注册,登录,浏览项目,保存收藏夹等。在我的代码中的几个地方,似乎当我创建某个东西的实例时,它没有被添加到我的模型中,所以我无法对它做任何事情。例如,当之前注册的用户尝试登录时,没有任何反应。我已经做了大约十几个虚拟帐户,真正奇怪的是,一个有效,其余的无效。我在终端中进入psql查看用户表,果然它只是一个添加到其中的帐户。如果我使用该帐户登录,则一切正常,而对于所有其他帐户,当我单击登录时没有任何反应。

稍后在代码中,我尝试在我的一条路线中为公园创建实例,当我尝试转到公园的单个页面时,我得到 404,因为没有一个公园被添加到公园表中。我也可以证明这一点,但我使用的语法是相同的。

@app.route('/signup', methods=["GET", "POST"])
def signup():
form = NewUserForm()
if form.validate_on_submit():
user = User.signup(
username=form.username.data,
password=form.password.data,
email=form.email.data,
)

db.session.commit()
do_login(user)
return redirect("/parks")
else:
return render_template('signup.html', form=form)

@app.route('/login', methods=["GET", "POST"])
def login():
"""Handle user login."""
form = LoginForm()
if form.validate_on_submit():
user = User.authenticate(form.username.data,
form.password.data)
if user:
do_login(user)
flash(f"Hello, {user.username}!")
return redirect("/parks")
flash("Username and/or password are incorrect", 'danger')
return render_template('/login.html', form=form)

如果有帮助,这是用户的模型:

class User(db.Model):
"""User in the system."""
__tablename__ = 'users'
id = db.Column(
db.Integer,
primary_key=True,
)
email = db.Column(
db.Text,
nullable=False,
unique=True,
)
username = db.Column(
db.Text,
nullable=False,
unique=True,
)
password = db.Column(
db.Text,
nullable=False,
)

@classmethod
def signup(cls, username, email, password):
hashed_pwd = bcrypt.generate_password_hash(password).decode('UTF-8')
user = User(
username=username,
email=email,
password=hashed_pwd,
)
db.session.add(user)
return user
@classmethod
def authenticate(cls, username, password):
user = cls.query.filter_by(username=username).first()
if user:
is_auth = bcrypt.check_password_hash(user.password, password)
if is_auth:
return user
return False

看来你正在使用SQLAlchemy?如果是这样,仅仅Session.add()对象将其写入数据库是不够的;实际的数据库INSERT发生在执行Session.flush()时,该执行排队的所有更改。

@classmethod
def signup(cls, username, email, password):
hashed_pwd = bcrypt.generate_password_hash(password).decode('UTF-8')
user = User(
username=username,
email=email,
password=hashed_pwd,
)
db.session.add(user)
db.session.flush()  # add this
return user

相关内容

  • 没有找到相关文章

最新更新