如何定义和创建用于 Flask-Login 的用户模型?

Dan*_*bio 4 python flask flask-login

我试图在我的 Flask 应用程序中声明一个 User 模型,以便使用 Flask-Login 扩展实现登录。从有关 sql alchemy 的烧瓶文档中,有一个示例,我已将其用于另一个名为“员工”的模型。这是代码:

class Employee(db.Model):
    __tablename__ = "employees"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200))
    title = db.Column(db.String(200))
    email = db.Column(db.String(200))
    department = db.Column(db.String(200))

    def __init__(self, name, title, email, department):
        self.name = name
        self.title = title
        self.email = email
        self.department = department

    def __repr__(self):
        return '<Employee %r>' % self.name
Run Code Online (Sandbox Code Playgroud)

这是取自此页面作为示例Flask SQL-Alchemy Docs

我很困惑,因为我也在使用 alembic 来运行迁移,所以通过使用alembic revision -m "create user table我已经创建了一个“用户”表。我使用 Flask Sql-Alchemy 指南的推荐创建了我的第一个模型表(员工):

from yourapplication.database import init_db
init_db()
Run Code Online (Sandbox Code Playgroud)

这是混乱。我现在需要建立一个用户模型进行身份验证。我该怎么做呢?到目前为止,这是我的代码:

class User(flask_login.UserMixin):
    def __init__(self, username, password):
        self.id = username
        self.password = password
Run Code Online (Sandbox Code Playgroud)

请注意,我的 User 类继承自flask_login.Usermixin. 我需要这个才能让 Flask Login 工作,所以现在它不像 Employee 模型那样实例化db.Model。但问题是我创建了一个 alembic 迁移来建立我的用户模型。为什么我无法查询数据库。我错过了什么拼图?

dav*_*ism 6

所有UserMixin所做的是提供一个通用的接口,任何用户模型需要实现与烧瓶登录工作。它不设置 SQLAlchemy 模型,而是混合到模型中。

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False, unique=True)
    active = db.Column(db.Boolean, nullable=False, default=True)

    @property
    def is_active(self):
        # override UserMixin property which always returns true
        # return the value of the active column instead
        return self.active
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 将 Python 类映射到数据库表。要创建这些表(如果它们不存在),请调用db.create_all()。如果表已经存在,更改模型不会改变它,需要删除并重新创建表。

由于删除表意味着您会丢失所有数据,因此最好在更改模型时迁移架构和数据。Alembic 将生成代表这些更改的脚本。不使用create_all,而是使用 Alembic 生成创建表的迁移,然后运行迁移。

alembic revision --autogenerate -m 'create user'
alembic upgrade head
Run Code Online (Sandbox Code Playgroud)

现在您有一个用户模型,并且已经使用初始迁移脚本创建了表,您可以对表执行查询并在实例上执行与登录相关的操作。

# create a user
u = User(name='davidism')
db.session.add(u)
db.session.commit()

# query all users
users = User.query.all()

# update a user
u = User.query.filter_by(name='davidism').one()
u.active = False
db.session.commit()

# check if a user is active like Flask-Login
print(u.is_active)
Run Code Online (Sandbox Code Playgroud)