Py学习  »  Python

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

Super sub • 1 年前 • 356 次点击  

我正在尝试使用flask创建一个大学系统,但我在登录系统上有一个问题,基本上我有两个班级:教师班和学生班。问题是我无法找到一种方法让登录管理器同时处理两个班级的登录,只有一个班级可以登录,当另一个班级尝试登录时,请将我作为班级登录。我的意思是,当我将登录管理器设置为接受学生它与学生一起工作,但当我尝试以教师身份登录时,它会在学生表而不是教师表中搜索,我不知道我是否正确解释了它,但我希望代码片段能够提供帮助

这是模特

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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133447
 
356 次点击  
文章 [ 2 ]  |  最新文章 1 年前
rajat yadav
Reply   •   1 楼
rajat yadav    2 年前

你可以这样做:

  1. 当用户登录时,搜索教师和学生数据库,然后登录。在登录时,创建一个会话变量,比如session['teacher']=true,以标识用户登录时的角色。

  1. 您还可以尝试为用户提供一个标识符以供选择。例如:我是:老师(checkbox)学生(checkbox)。根据所选的检查,查看该数据库。
snakecharmerb
Reply   •   2 楼
snakecharmerb    2 年前

这个 user_loader 回调收到一个 id 作为一个参数,并从该信息中返回定义为“用户”类的任何对象的实例。你已经有效地定义了 “User”类,在当前配置中,如果用户加载程序通过“1”,则无法确定是否应返回 Teacher id为1或 Student 身份证是1。

更好的设计可能是搬家 email password 进入一个新的世界 User 类,并在 使用者 大学生 教师 。您可以添加一些验证,以确保 使用者 不能同时与一个 大学生 还有 教师 .