2017-06-01 138 views
1

在我的燒瓶web應用程序中,我有一個登錄系統。當用戶登錄時,在我的數據庫的表中,我想更新用戶進行上次登錄時的日期時間。 我使用這個代碼:燒瓶更新查詢

@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])) 

只是

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

在檢查,如果1項的列表中包含的東西,這一比例僅爲測試平等沒點。

最後,你創建了一個新的Session類和一個實例s它,但你提交了一個不同的會話:db.session,你應該一直在使用它。這意味着你的更新不會發生,因爲該會話的事務並未實際提交。

+0

謝謝。它工作沒有錯誤,但它似乎在數據庫data_ora_ultimo_accesso不更新。 –

+0

你是否修復了會話處理?不要創建單獨的會話,但始終使用'db.session'。順便說一句,你也可以使用ORM來執行更新:'result.codice_fiscale = datetime.now()'然後提交。 –

+0

您的意思是使用相同的會話:Session = sessionmaker(bind = engine) s = Session()如何一致地使用db.session? –