使用 flask_login 的不同用户类型在 python 中实施登录系统

Implement Login system in python using flask_login with different user types

我正在尝试使用 Flask 创建一个大学系统,但我的登录系统有问题基本上我有两个 classes 教师 class 和学生 class 问题是我想不出一种方法让登录管理器同时处理两个 classes 登录,只有一个可以登录,当另一个 class 尝试登录时,它会将我记录为 class 我的意思是当我设置登录管理器接受学生时它与学生一起工作但是当我尝试以教师身份登录时它在学生 table 而不是教师 table 中搜索我不不知道我解释得对不对,但我希望代码片段对您有所帮助

这是模型

attend = db.Table('attend',
    db.Column('teacher_id',db.Integer,db.ForeignKey('teacher.id')),
    db.Column('student_id', db.Integer, db.ForeignKey('student.id'))
)

class Teacher(db.Model,UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String(60),nullable=False)
    email=db.Column(db.String(100),nullable=False,unique=True)
    password=db.Column(db.String(60),nullable=False)
    department=db.Column(db.String(50),nullable=False)
    students=db.relationship('Student',secondary=attend,backref='students',lazy='dynamic')


    def type_auth(self):
        return True

    def __repr__(self) -> str:
        return f'name:{self.name} email:{self.email} department:{self.department}'


class Student(db.Model,UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String(60),nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)
    password = db.Column(db.String(60), nullable=False)
    year=db.Column(db.Integer,nullable=False)
    grades = db.relationship('Grades', backref='Rates', lazy='dynamic')

    def type_auth(self):
        return False
    
    def __repr__(self) -> str:
        return f'name:{self.name} email:{self.email} year:{self.year}'

这个登录管理器

def create_app():
    app=Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI']=f'sqlite:///{DB_NAME}'
    app.config['SECERT_KEY'] = '1853d2c8983cff3b'
    app.config['FLASK_ADMIN_SWITCH']='Cyborg'
    db.init_app(app)

    from .auth import auth
    from .routes import routes

    app.register_blueprint(auth,prefix_url='/')
    app.register_blueprint(routes,prefix_url='/')

    login_manger=LoginManager()
    login_manger.login_view='auth.login'
    login_manger.login_message_category='info'
    login_manger.init_app(app)

    @login_manger.user_loader
    def user_loader(id):
        #i need help here

    return app

你可以这样做:

  1. 当用户登录时,在教师和学生数据库中搜索,然后让他们登录。在登录时,创建一个会话变量,例如 session['teacher'] = true,以在人已登录。

  1. 您也可以尝试提供一个标识符供用户选择。例如:我是一个:老师(chekcbox)学生(checkbox)。根据选择的检查,查看该数据库。

user_loader 回调接收到一个 id 作为参数,并且根据该信息,预期 return 您定义为“用户”的任何实例 class.您已经有效地定义了 two "User" classes,并且在当前配置中,用户加载程序无法通过“1”来确定它是否应该return ID 为 1 的 Teacher 或 ID 为 1 的 Student

更好的设计可能是将 emailpassword 移动到新的 User class 中,并在 [=16= 之间创建一对一关系] 和 StudentTeacher。您可以添加一些验证以确保 User 不能同时与 StudentTeacher.

相关