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'

データベースからデータを取得するためのロジックが正しくないことはわかっています。私は SQLalchemy についてほとんど知識がありません。

テーブルから列の値をフェッチUsername(および)し、同じものがあるかどうかを確認するにはどうすればよいですか?EmailUsersform.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

1 つのクエリで実行することもできます。

 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 に答える