Flask-SQLAlchemy-你能在模型中进行查询吗?

时间:2013-12-15 13:47:03

标签: sqlalchemy flask flask-sqlalchemy flask-login

我正在构建一个使用Flask-SQLAlchemy的烧瓶webapp,我也在考虑使用Flask-Login来处理会话并保护某些视图。

Flask-Login需要某些方法,我认为这些方法对应用的各个部分都有用(具体来说,is_authenticated()is_active()。但是,在所有示例中,我看到这些方法只是返回如果我想对数据库进行查询,该怎么办?例如,如果我想检查该用户是否确实在表中有一个条目(我使用LDAP登录,那么希望用户能够即使他们没有在表格中输入,也要登录,虽然我需要查看他们是否在那里。“

但我不知道是否可以从定义它的类中对表本身进行查询?或者我应该将这些函数放在其他地方(即使在用户类中使用flask-login需要这些方法)?

2 个答案:

答案 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()等所需的方法,它就可以是任何对象。

根据您的描述,在我看来,您需要的用户表示不是一对一地映射到数据库中的用户表,因为您拥有不在数据库中的有效用户。

您可以采取的一种方法是拥有两个用户类,两者都实现了所需的方法。我们称这些为DBUserLDAPUser。只要你想出一个策略,在两个类的实例之间拥有唯一的ID,Flask-Login就不在乎了。

DBUser类可以是基于Flask-SQLAlchemy的正确数据库模型,可以直接实现is_xxx()方法。另一方面,LDAPUser类可以实现这些方法,将任何必要的数据库查询发布到DBUser.query