2017-06-01 16 views
1

私のFlaskウェブアプリケーションでは、私はログインシステムを持っています。ユーザーがログオンすると、データベースのテーブルに、ユーザーが最後のログインを行った日時を更新します。 私はこのコードを使用しています:フラスコ更新クエリ

@app.route('/login', methods=['POST']) 
def do_admin_login(): 
    POST_CODICE_FISCALE = str(request.form['codice_fiscale']) 
    POST_PASSWORD = str(request.form['password']) 
    pwd_enc=base64.b64encode(POST_PASSWORD) 

    Session = sessionmaker(bind=engine) 
    s = Session() 
    query = s.query(User).filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]), User.password.in_([pwd_enc])) 
    result = query.first() 
    if result: 
     session['logged_in'] = True 
     query = s.query(User).filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]).update(User.data_ora_ultimo_accesso=datetime.now())) 
     query.first() 
     db.session.commit() 
    else: 
     flash('wrong password!') 
    return home() 

を私はエラーが表示されます。

query = s.query(User).filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]).update(User. 
data_ora_ultimo_accesso=datetime.now())) 
SyntaxError: keyword can't be an expression 

それは間違っているでしょうか?ありがとう。

答えて

1

エラーが示すように、関数呼び出し引数リストのキーワードは、User.data_ora_ultimo_accessoなどの式ではなく、identifierです。代わりにあなたがQuery.update()に列の辞書を渡す必要があり、表現のペア:あなたはすぐにコミットするため、すべての状態がとにかく期限切れされるので、セッションを同期する必要は、ありませんことを

query = s.query(User).\ 
     filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]).\ 
     update({ User.data_ora_ultimo_accesso: datetime.now() }, 
       synchronize_session=False)) 

注意。

また、コードの可読性を向上させるためにいくつかの変更を加えることもできます。たとえば、代わりの

filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]), 
     User.password.in_([pwd_enc])) 

1つの項目のリストがちょうど平等のテストに比べ、何かが含まれているかどうかをチェック中だけ

filter(User.codice_fiscale == POST_CODICE_FISCALE, 
     User.password == pwd_enc) 

ない点。

最後に、新しいSessionクラスとそれのインスタンスsを作成しますが、別のセッションをコミットします:db.session、おそらくこれまでに使用していたはずです。これは、セッションのトランザクションが実際にコミットされないため、更新が行われないことを意味します。

+0

ありがとうございました。それはエラーなしで動作しますが、データベースにあるようです。data_ora_ultimo_accessoは更新ではありません。 –

+0

セッション処理を修正しましたか?別のセッションを作成せず、一貫して 'db.session'を使用してください。 Btwを使用すると、ORMを使用して更新を実行することもできます: 'result.codice_fiscale = datetime.now()'そして次にコミットします。 –

+0

同じセッションを使用しますか?Session = sessionmaker(bind = engine) s = Session()db.sessionは一貫してどのように使用できますか? –