首页 > 解决方案 > 使用具有不同用户类型的flask_login在python中实现登录系统

问题描述

我正在尝试使用烧瓶创建一个大学系统,但我的登录系统有问题,基本上我有两个班级教师班级和学生班级问题是我无法想办法让登录管理器处理两个班级登录同时只有一个人可以登录,当其他班级尝试登录时,将我作为班级登录我的意思是,当我设置登录管理器以接受学生时,它与学生一起工作,但是当我尝试以教师身份登录时在学生表而不是教师表中搜索我不知道我是否解释正确但我希望代码片段有所帮助

这是模型

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

标签: pythonpython-3.xflaskflask-sqlalchemyflask-login

解决方案


user_loader回调接收一个作为参数,并从该id信息中返回一个您定义为“用户”类的实例。您已经有效地定义了两个“用户”类,并且在当前配置中,如果传递“1”,用户加载器无法确定它应该返回Teacherid 1 还是Studentid 1。

更好的设计可能是将emailandpassword移入一个新类,并在and和User之间创建一对一的关系。您可以添加一些验证以确保 a不能同时与 a和 a相关。UserStudentTeacherUserStudentTeacher


推荐阅读