问题描述
我正在创建一个Flask应用程序,其中可以注册和登录2种类型的用户。在@ login.user_loader函数中,如何配置它以根据登录的用户类型检查不同的表? / p>
这是我的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,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),unique=True)
password_hash = db.Column(db.String(120))
def __repr__(self):
return '<Doctor {}>'.format(self.full_name)
def set_password(self,password)
当前,仅针对“患者”表进行配置。如何设置这种方式,以便每当医生登录时就从医生表中提取信息?
P.S:-我确实有一个选择输入,该输入采用在“登录”页面上登录的用户类型。我可以在user_loader函数中的某处使用该选择数据吗?
解决方法
尝试使用Joined Table Inheritance-创建单个User类,Doctor和Patient类从中继承。这样,他们共享公用属性(例如电子邮件和密码),但也具有自己的独特属性。 SQLAlchemy中的这种多态性为每个类使用独立的表,但是页面上还有其他示例使用不同的方法。
一个例子:
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))