python - 使用具有不同用户类型的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
解决方案
user_loader
回调接收一个作为参数,并从该id
信息中返回一个您定义为“用户”类的实例。您已经有效地定义了两个“用户”类,并且在当前配置中,如果传递“1”,用户加载器无法确定它应该返回Teacher
id 1 还是Student
id 1。
更好的设计可能是将email
andpassword
移入一个新类,并在and和User
之间创建一对一的关系。您可以添加一些验证以确保 a不能同时与 a和 a相关。User
Student
Teacher
User
Student
Teacher