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

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))