在我的 Flask 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
哪里出了问题? 谢谢。
最佳答案
正如错误所述,函数调用参数列表中的关键字不能是表达式,例如 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))
请注意,由于您立即提交,因此无需同步 session ,因为所有状态无论如何都会过期。
您还可以进行一些更改来提高代码的可读性。例如代替
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
,但您提交了一个不同的 session :db.session
,您可能应该一直使用它。这意味着您的更新将不会发生,因为该 session 的事务并未实际提交。
关于python - Flask 更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44308889/