【问题标题】:Python Flask: AttributeError: 'NoneType' object has no attribute 'is_active'Python Flask:AttributeError:“NoneType”对象没有属性“is_active”
【发布时间】:2014-02-14 17:45:06
【问题描述】:

使用Flask Mega Tutorial 我正在尝试学习 Flask。在part 5 of the tutorial,我现在正在构建一个需要用户登录的个人资料页面。

因为我使用的是 peewee ORM 而不是 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 方法(不是属性)出现在 User 类中,如下所示:

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)

但我有点不明白为什么这会给我带来错误。所以我的问题真的是:有人知道我在这里做错了什么吗?

欢迎任何提示,因为我完全迷路了..

【问题讨论】:

  • 如果用户为 None,则不应使用 login_user。当你创建一个用户时,这个新创建的用户永远不会分配给用户变量
  • 愚蠢的我。谢谢!我每天都在学习.. :)

标签: python attributes flask attributeerror peewee


【解决方案1】:

在块中开始

if user is None:

你真的是分配 em>到user,所以它仍然是None,你得到了错误。尝试更改为:

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

或呼叫

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

再次在if block

的末尾

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2014-02-04
    • 2013-04-19
    • 2019-10-03
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多