在我的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
这是错的? 感谢。
答案 0 :(得分: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
,您可能已经使用了所有会话沿。这意味着您的更新不会发生,因为该会话的交易实际上没有提交。