如何定义和创建用于 Flask-Login 的用户模型?
How do I define and create a User model for use with Flask-Login?
我试图在我的 Flask 应用程序中声明一个用户模型,以便使用 Flask-Login 扩展实现登录。从有关 sql alchemy 的烧瓶文档中,有一个示例,我将其用于另一个名为 employees 的模型。这是代码:
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
这是取自该页面的示例 Flask SQL-Alchemy Docs
我很困惑,因为我也在使用 alembic 进行 运行 迁移,所以通过使用 alembic revision -m "create user table
我已经创建了一个 'users' table。我使用 Flask Sql-Alchemy 指南的推荐创建了我的第一个模型 table(员工):
from yourapplication.database import init_db
init_db()
这里是混乱。我现在需要建立一个用于身份验证的用户模型。我该怎么做呢?到目前为止,这是我的代码:
class User(flask_login.UserMixin):
def __init__(self, username, password):
self.id = username
self.password = password
请注意,我让用户 class 继承自 flask_login.Usermixin
。我需要这个才能让 Flask Login 工作,所以现在它不像 db.Model
中的 Employee 模型那样被实例化。但问题是我创建了一个 alembic 迁移来建立我的用户模型。为什么我无法查询数据库。我缺少哪一块拼图?
UserMixin
所做的只是提供一个通用接口,任何用户模型都需要实现该接口才能与 Flask-Login 一起使用。它不设置 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
SQLAlchemy 将 Python 类 映射到数据库 table。要创建这些 table(如果它们不存在),请调用 db.create_all()
。如果 table 已经存在,如果您更改模型,它不会被更改,您需要删除并重新创建 table。
由于删除 tables 意味着您会丢失所有数据,因此最好在更改模型时 迁移 模式和数据。 Alembic 将生成表示这些更改的脚本。不使用 create_all
,而是使用 Alembic 生成迁移,创建 table,然后 运行 迁移。
alembic revision --autogenerate -m 'create user'
alembic upgrade head
现在您已经有了用户模型,并且已经使用初始迁移脚本创建了 table,您可以在 table 上执行查询并在实例上执行与登录相关的操作。
# 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)
我试图在我的 Flask 应用程序中声明一个用户模型,以便使用 Flask-Login 扩展实现登录。从有关 sql alchemy 的烧瓶文档中,有一个示例,我将其用于另一个名为 employees 的模型。这是代码:
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
这是取自该页面的示例 Flask SQL-Alchemy Docs
我很困惑,因为我也在使用 alembic 进行 运行 迁移,所以通过使用 alembic revision -m "create user table
我已经创建了一个 'users' table。我使用 Flask Sql-Alchemy 指南的推荐创建了我的第一个模型 table(员工):
from yourapplication.database import init_db
init_db()
这里是混乱。我现在需要建立一个用于身份验证的用户模型。我该怎么做呢?到目前为止,这是我的代码:
class User(flask_login.UserMixin):
def __init__(self, username, password):
self.id = username
self.password = password
请注意,我让用户 class 继承自 flask_login.Usermixin
。我需要这个才能让 Flask Login 工作,所以现在它不像 db.Model
中的 Employee 模型那样被实例化。但问题是我创建了一个 alembic 迁移来建立我的用户模型。为什么我无法查询数据库。我缺少哪一块拼图?
UserMixin
所做的只是提供一个通用接口,任何用户模型都需要实现该接口才能与 Flask-Login 一起使用。它不设置 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
SQLAlchemy 将 Python 类 映射到数据库 table。要创建这些 table(如果它们不存在),请调用 db.create_all()
。如果 table 已经存在,如果您更改模型,它不会被更改,您需要删除并重新创建 table。
由于删除 tables 意味着您会丢失所有数据,因此最好在更改模型时 迁移 模式和数据。 Alembic 将生成表示这些更改的脚本。不使用 create_all
,而是使用 Alembic 生成迁移,创建 table,然后 运行 迁移。
alembic revision --autogenerate -m 'create user'
alembic upgrade head
现在您已经有了用户模型,并且已经使用初始迁移脚本创建了 table,您可以在 table 上执行查询并在实例上执行与登录相关的操作。
# 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)