Flask更新查询

2024-03-29 06:31:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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()

但我收到了一个错误:

^{pr2}$

怎么了? 谢谢。在


Tags: 用户informrequestloginpasswordquerypost
1条回答
网友
1楼 · 发布于 2024-03-29 06:31:29

正如错误所说,函数调用参数列表中的关键字不能是表达式,例如User.data_ora_ultimo_accesso,而是identifier。相反,您应该传递^{}一个包含列、表达式对的字典:

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

请注意,由于您立即提交,因此不需要同步会话,因为无论如何,所有状态都将过期。在

您还可以进行一些更改,以提高代码的可读性。例如,而不是

^{pr2}$

只是

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

与仅仅测试相等性相比,检查一个包含1项的列表是否包含某些内容没有任何意义。在

最后,您创建了一个新的Session类和它的一个实例s,但是您提交了一个不同的会话:db.session,您应该一直使用它。这意味着您的更新不会发生,因为该会话的事务实际上没有提交。在

相关问题 更多 >