【问题标题】:Flask-SQLAlchemy– Can you make a query within a model?Flask-SQLAlchemy——你能在模型中进行查询吗?
【发布时间】:2014-01-02 22:01:00
【问题描述】:

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

Flask-Login 需要某些我认为对应用程序的各个部分有用的方法(特别是 is_authenticated()is_active()。但是,在所有示例中,我看到这些方法只是返回一些固定的东西。什么如果我想对数据库进行查询。例如,如果我想检查该用户是否在表中确实有一个条目(我正在使用 LDAP 登录,所以希望用户能够登录,即使他们在表格中没有条目,虽然我需要看看他们是否在那里)。

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

【问题讨论】:

  • 当您在其中一种方法中尝试self.query.filter(your=criteria, goes=here) 时会发生什么? ;-)
  • @SeanVieira 我通过了一个标准(用户名=self.username),但它似乎不喜欢它:TypeError: <lambda>() got an unexpected keyword argument 'username'

标签: sqlalchemy flask flask-sqlalchemy flask-login


【解决方案1】:

你可以。通常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(...)
       # ...

【讨论】:

  • 啊,看起来不错。我导入了from sqlalchemy.orm.session import Session,然后导入了session = Session.object_session(self)。但是,会话似乎是None。我想知道我做错了什么?
  • 对象 (self) 是否已添加到会话或从数据库加载?如果它是一个全新的实例并且它没有被添加到会话中(瞬态;参见Quickie Intro to Object States),object_session 确实会返回None。在这种情况下,您总是可以创建一个新会话;但在 Web 应用程序中,通常使用上下文会话。请参阅Contextual/Thread-local Sessions 了解更多信息。
  • 啊,因为该条目还没有在数据库中,而且我还没有提交,所以还没有任何会话。我将如何在课堂上创建一个,同时仍然保持在我需要使用的方法的规范内?因为我认为我无法在这些方法中传递绑定详细信息。
  • 查看我上面关于上下文/线程本地会话的评论,但也许 Miguel 的回答也很有用。我对 Flask 和 Flast-SQLAlchemy 一无所知
【解决方案2】:

Flask-Login 要求您在用户加载程序回调中提供一个用户对象。这个用户不需要有数据库条目支持,它可以是任何对象,只要它实现了is_authenticated()is_active()等所需的方法。

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

您可以采用的一种方法是拥有两个用户类,它们都实现了所需的方法。我们称它们为DBUserLDAPUser。只要您想出一个策略,让 Flask-Login 不会关心这两个类的实例之间的唯一 ID。

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

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2014-05-18
    • 1970-01-01
    • 2013-07-24
    • 2015-05-26
    相关资源
    最近更新 更多