如何在烧瓶登录中使用多个用户 类?
How to use multiple User Classes in flask login?
我正在创建一个 Flask 应用程序,其中 2 种类型的用户可以注册和登录。在 @login.user_loader 函数中,我如何配置它以检查不同的 tables 基于登录的用户类型?
这是我的 models.py 代码:-
from app import db, login
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
@login.user_loader
def load_user(id):
return Patient.query.get(int(id))
class Patient(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
full_name = db.Column(db.String(64), index=True)
city = db.Column(db.String(20))
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(120))
def __repr__(self):
return '<Patient {}>'.format(self.full_name)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Doctor(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
full_name = db.Column(db.String(64), index=True)
city = db.Column(db.String(20))
qual = db.Column(db.String(20))
fees = db.Column(db.Integer)
phone = db.Column(db.Integer)
address = db.Column(db.String(120))
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(120))
def __repr__(self):
return '<Doctor {}>'.format(self.full_name)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
目前,它仅为患者table配置。如何将其设置为每当 Doctor 登录时,它都会从 Doctor 的 table?
中提取信息
P.S:- 我确实有一个选择输入,它采用在登录页面上登录的用户类型。我可以在 user_loader 函数的某处使用该选择数据吗?
尝试使用 Joined Table Inheritance - 创建一个用户 class,医生和病人 class 继承自该用户。这样他们共享共同的属性(如电子邮件和密码)但也有自己独特的属性。 SQLAlchemy 中的这种类型的多态性为每个 class 使用独立的表,但页面上还有其他使用不同方法的示例。
一个例子:
class User(UserMixin, db.Model):
email = ...
password_hash = ...
__mapper_args__ = {
'polymorphic_identity':'user',
'polymorphic_on':type
}
class Doctor(User):
fees = ...
__mapper_args__ = {
'polymorphic_identity':'user'
}
那么您的 user_loader 函数可以如下所示:
@login.user_loader
def load_user(id):
return User.query.get(int(id))
我正在创建一个 Flask 应用程序,其中 2 种类型的用户可以注册和登录。在 @login.user_loader 函数中,我如何配置它以检查不同的 tables 基于登录的用户类型?
这是我的 models.py 代码:-
from app import db, login
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
@login.user_loader
def load_user(id):
return Patient.query.get(int(id))
class Patient(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
full_name = db.Column(db.String(64), index=True)
city = db.Column(db.String(20))
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(120))
def __repr__(self):
return '<Patient {}>'.format(self.full_name)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Doctor(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
full_name = db.Column(db.String(64), index=True)
city = db.Column(db.String(20))
qual = db.Column(db.String(20))
fees = db.Column(db.Integer)
phone = db.Column(db.Integer)
address = db.Column(db.String(120))
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(120))
def __repr__(self):
return '<Doctor {}>'.format(self.full_name)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
目前,它仅为患者table配置。如何将其设置为每当 Doctor 登录时,它都会从 Doctor 的 table?
中提取信息P.S:- 我确实有一个选择输入,它采用在登录页面上登录的用户类型。我可以在 user_loader 函数的某处使用该选择数据吗?
尝试使用 Joined Table Inheritance - 创建一个用户 class,医生和病人 class 继承自该用户。这样他们共享共同的属性(如电子邮件和密码)但也有自己独特的属性。 SQLAlchemy 中的这种类型的多态性为每个 class 使用独立的表,但页面上还有其他使用不同方法的示例。
一个例子:
class User(UserMixin, db.Model):
email = ...
password_hash = ...
__mapper_args__ = {
'polymorphic_identity':'user',
'polymorphic_on':type
}
class Doctor(User):
fees = ...
__mapper_args__ = {
'polymorphic_identity':'user'
}
那么您的 user_loader 函数可以如下所示:
@login.user_loader
def load_user(id):
return User.query.get(int(id))