如何在flask登录中使用多个用户类?

问题描述

我正在创建一个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))