我正在使用Flask + Python并检查是否已经使用用户名(以及电子邮件)我正在使用此逻辑:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = SignupForm()
if form.validate_on_submit():
user = Users.query.filter_by(username=form.username.data).first()
email = Users.query.filter_by(email=form.email.data).first()
if form.username.data in user:
error = 'Username already taken. Choose another'
elif form.email.data in email:
error = 'Email already registered. Login or register with another Email'
else:
user = Users(
form.username.data,
form.password.data,
#form.confirm.data ,
form.email.data,
1,
# form.cityaddress.data,
# form.countryaddress.data,
#form.accept_tos.data,
)
db.session.add(user)
db.session.commit()
return redirect(url_for('index'))
但它的错误如object has no attribute 'username'
我知道从db获取数据的逻辑不正确。我对SQLalchemy知之甚少。
您能否建议我如何从表Username
中获取Email
(和Users
)列值,然后检查它们是否与form.username.data
相同?
答案 0 :(得分:3)
您的查询看起来很好,first()
的返回值将是您的User对象的实例,如果没有结果,则为None
:
u = Users.query.filter_by(username=form.username.data).first()
if u is not None:
print u.username
print u.email
因此,这就是你的逻辑可能是什么样的:
user_by_name = Users.query.filter_by(username=form.username.data).first()
user_by_email = Users.query.filter_by(email=form.email.data).first()
if user_by_name:
error = 'Username already taken. Choose another'
elif user_by_email:
error = 'Email already registered. Login or register with another Email'
else:
#Unique user and email
您也可以在一个查询中执行此操作:
existing = Users.query.filter((Users.username == form.username.data) | (Users.email == form.email.data)).all()
if existing:
error = 'User or email taken'
请注意使用filter
而不是filter_by
- 您无法使用filter_by
中的按位运算符。这是一个快速working example
答案 1 :(得分:1)
您的错误让我感到困惑。也就是说,除了测试之外,您的代码看起来还不错。我当时用这个:
user = Users.query.filter_by(username=form.username.data).first()
...
if user is not None:
error("user already found")