4

我正在使用 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

4

2 回答 2

5

您的查询看起来不错,返回值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. 这是一个快速工作示例

于 2013-04-06T12:11:30.037 回答
1

你的错误让我很困惑。也就是说,除了测试之外,您的代码看起来还不错。然后我用这个:

user = Users.query.filter_by(username=form.username.data).first()
...
if user is not None:
    error("user already found")
于 2013-04-06T12:06:41.883 回答