2014-01-15 22 views
3

我試圖通過遵循Flask Mega Tutorial來學習Peewee ORM和Flask的組合。在part 5 of the tutorial我使用OpenID創建一個登錄。在克服了一堆障礙之後,我現在在粘貼在下面的行上的函數中出現AttributeError:login_user(user, remember = remember_me)AttributeError:'SelectQuery'對象沒有屬性'is_active'

@oid.after_login 
def after_login(resp): 
    if resp.email is None or resp.email == "": 
     flash('Invalid login. Please try again.') 
     return redirect(url_for('login')) 
    user = User.select().where(User.email == resp.email)  
    if user.wrapped_count() == 0: 
     nickname = resp.nickname 
     if nickname is None or nickname == "": 
      nickname = resp.email.split('@')[0] 
     user = User(nickname = nickname, email = resp.email, role = models.ROLE_USER) 
     user.save() 
    remember_me = False 
    if 'remember_me' in session: 
     remember_me = session['remember_me'] 
     session.pop('remember_me', None) 
    login_user(user, remember = remember_me) 
    return redirect(request.args.get('next') or url_for('index')) 

is_active在我的用戶模型中找到如下:

class User(db.Model): 
    nickname = TextField() 
    email = TextField() 
    role = IntegerField(default = ROLE_USER) 

    def is_authenticated(self): 
     return True 

    def is_active(self): 
     return True 

    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return self.id 

    def __repr__(self): 
     return '<User %r>' % (self.nickname) 

我不知道我在做什麼錯在這裏雖然。有誰能幫我解決我在這裏做錯的事嗎?

歡迎所有提示!

回答

7

如錯誤所示,user = User.select().where(User.email == resp.email)會返回SelectQuery,而不是User的實例。您需要包含額外的方法調用來實際獲取記錄,如.first()first將返回UserNone的實例。

這將使你稍微調整你的代碼:

user = User.select().where(User.email == resp.email).first() 
if not user: # or if user is None: 
    nickname = resp.nickname 
    ... 
+0

真棒!太感謝了! – kramer65

+0

我是新來的peewee,但我認爲現在相當於'first()'是'get()' – jwong