2014-01-23 2 views
1

Использование Flask Mega Tutorial Я пытаюсь изучить Flask. В part 5 of the tutorial Теперь я создаю страницу профиля, в которой пользователь должен войти в систему.Python Flask: AttributeError: объект «NoneType» не имеет атрибута 'is_active'

Поскольку я использую ORI peewee вместо SQLAlchemy, я корректирую код здесь и там, но для этого случая я не делаю Думаю, это важно. Теперь я вхожу в систему, используя мою учетную запись Google (openID) и нажимаю ошибку AttributeError: 'NoneType' object has no attribute 'is_active'. Ошибка возникает в конце этой функции в строке, которая говорит login_user(user, remember = remember_me).

@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).first() 

    if user is None: 
     nickname = resp.nickname 
     if nickname is None or nickname == "": 
      nickname = resp.email.split('@')[0] 
     User(nickname = nickname, email = resp.email, role = models.ROLE_USER, last_seen = datetime.utcnow()).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 = CharField() 
    email = CharField(max_length=150) 
    role = IntegerField(default = ROLE_USER) 
    about_me = TextField(null = True, max_length=140) 
    last_seen = DateTimeField() 

    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 avatar(self, size): 
     return 'http://www.gravatar.com/avatar/' + md5(self.email).hexdigest() + '?d=mm&s=' + str(size) 

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

Но я вроде потерял, почему это было бы бросить мне ошибку. Поэтому мой вопрос действительно: кто-нибудь знает, что я здесь делаю неправильно?

Любые советы приветствуются, так как я полностью потерял ..

+2

Вы не должны использовать login_user, если пользователь не является None. И когда вы создаете пользователя, этот вновь созданный пользователь никогда не назначается пользовательской переменной – gawel

+0

Глупо меня. Благодаря! Я учусь день ото дня .. :) – kramer65

ответ

3

Нигде в блоке начиная

if user is None: 

вы на самом деле назначить ничего user, так что это еще None и вы получить ошибку. Попробуйте изменить на:

user = User(nickname = nickname, ...) 

или позвоните

user = User.select().where(User.email == resp.email).first() 

снова в конце if блока

 Смежные вопросы

  • Нет связанных вопросов^_^