我正在构建一个使用Flask-SQLAlchemy的烧瓶webapp,我也在考虑使用Flask-Login来处理会话并保护某些视图。
Flask-Login需要某些方法,我认为这些方法对应用的各个部分都有用(具体来说,is_authenticated()
和is_active()
。但是,在所有示例中,我看到这些方法只是返回如果我想对数据库进行查询,该怎么办?例如,如果我想检查该用户是否确实在表中有一个条目(我使用LDAP登录,那么希望用户能够即使他们没有在表格中输入,也要登录,虽然我需要查看他们是否在那里。“
但我不知道是否可以从定义它的类中对表本身进行查询?或者我应该将这些函数放在其他地方(即使在用户类中使用flask-login需要这些方法)?
答案 0 :(得分:6)
你可以。通常Session.object_session
是获取会话和执行查询的好方法:
class MyModel(Base):
__tablename__ = u'model_table'
id = Column(Integer, primary_key=True)
# ...
def my_method(self):
session = Session.object_session(self)
qry = session.query(...).filter(...)
# ...
答案 1 :(得分:0)
Flask-Login要求您在用户加载程序回调中提供用户对象。此用户不需要由数据库条目支持,只要它实现了is_authenticated()
和is_active()
等所需的方法,它就可以是任何对象。
根据您的描述,在我看来,您需要的用户表示不是一对一地映射到数据库中的用户表,因为您拥有不在数据库中的有效用户。
您可以采取的一种方法是拥有两个用户类,两者都实现了所需的方法。我们称这些为DBUser
和LDAPUser
。只要你想出一个策略,在两个类的实例之间拥有唯一的ID,Flask-Login就不在乎了。
DBUser
类可以是基于Flask-SQLAlchemy的正确数据库模型,可以直接实现is_xxx()
方法。另一方面,LDAPUser
类可以实现这些方法,将任何必要的数据库查询发布到DBUser.query
。