2013-12-15 42 views
2

我正在构建一个使用Flask-SQLAlchemy的Web应用程序,我也在考虑使用Flask-Login来照顾会话并保护某些视图。Flask-SQLAlchemy-你可以在模型中进行查询吗?

瓶,登录需要一定的方法,这是我看到的应用程序(特别是is_authenticated()is_active()的各部分一样有用。然而,在所有我见过这些方法的例子只是返回一些固定的。如果我想要什么例如,如果我想检查该用户是否实际在表中有条目(我正在使用LDAP登录,所以希望用户即使没有登录也能登录)虽然我需要看看它们是否在那里)

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

+0

当您在其中一个方法中尝试“self.query.filter(your = criteria,goes = here)”时会发生什么? ;-) –

+0

@SeanVieira我通过它一个标准(username = self.username),但它似乎并不喜欢它:'TypeError:()得到了一个意外的关键字参数'username'' – penguin

回答

5

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

啊,看起来对。我已经从'sqlalchemy.orm.session import'导入',然后'session = Session.object_session(self)'。然而,会话似乎是“无”。我不知道我做错了什么? – penguin

+0

对象('self')是否已添加到会话或从数据库加载?如果它是一个全新的实例,并且它尚未添加到会话中(Transient;请参见[Quickie Intro to Object States](http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#quickie- intro-to-object-states)),'object_session'确实会返回'None'。在这种情况下,你总是可以创建一个新的会话;但在Web应用程序中,通常使用上下文会话。有关更多信息,请参阅[上下文/线程本地会话](http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#contextual-thread-local-sessions)。 – van

+0

啊,因为这个入口还没有在数据库中,而且我还没有提交,所以还没有任何会话。我将如何在课堂上创建一个,同时仍然保持在我需要使用的方法的规范中?因为我认为我不能在这些方法中传递绑定细节。 – penguin

0

烧瓶登录,您需要提供用户加载回调用户对象。此用户不需要数据库条目的支持,只要它实现所需的方法(如is_authenticated()is_active()),它可以是任何对象。

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

您可以采取的一种方法是拥有两个用户类,都实现所需的方法。我们称之为DBUserLDAPUser。只要你想出一个策略来在两个类的实例中拥有唯一的标识,Flask-Login就不会在意。

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

相关问题