导航

flask_login简例走起

Posted on 2021-04-30 09:34  old_dog~  阅读(544)  评论(0)    收藏  举报

flask_login

  • 介绍:

    flask_login是一个用于登录管理的flask轻型框架,大致的登录验证方式如下图所示。

这里需要说明一下,session信息在本地的存储方式为cookies,而在服务端是一个每次获取cookies然后从数据库读取数据进行对比的一个过程。对比的一个主要数据是User对象的get_id()方法返回的数据。

  • 使用

    • User类的定义,继承db.Model(数据库)和UserMixin(登录用户):

      class User(db.Model, UserMixin):    
         __tablename__ = 'user'    
         id = db.Column(db.Integer, primary_key=True)    
         username = db.Column(db.String(255))    
         pd =  db.Column( db.String(20), )    
       
      def get_id(self):        
         return self.id # 注意这个返回的参数
    • 回调函数LoginManager() .user_loader

      @login_manager.user_loader # 装饰器
      def load_user(user_id):
         return User.query.filter_by(id=user_id).first()
      """
      这个方法需要注意两个地方:
        (1)必须返回这样一个User类的实例化对象
        (2)查询的参数必须是get_id返回的属性
      """

       

    • 参数的配置

      login_manager = LoginManager() 
      login_manager.session_protection = "strong" # 会话保护类型
      login_manager.login_view = 'login' # 没有权限时返回的网页。 注意:”login“是endpoint
      login_manager.init_app(app)
      app.config["LOGIN_DISABLED"] = True # False, 是否过滤未登录用户。如果是True,那么login_required将不起作用
    • 登录、退出、以及需要登录的若干视图

      @app.route("/login") # 登录url
      def login( ):
         form = request.values.to_dict()
         uid = form.get("uid", "")
         upd = form.get("upd", "")
         user = User.query.filter_by(id=uid).first()
         if user:
             if user.pd == upd:
                 login_user(user) # 最主要的操作:建立session,并将登录信息以cookies形式保存到客户端
                 return jsonify(message="登录成功!", uid=uid, uname=user.username)
             else:
                 return jsonify(message="密码错误!", uid=uid)
         return jsonify(message="账户不存在! ")


      @app.route('/logout') # 退出url
      def logout():
         if current_user.is_authenticated:
             logout_user() # 删除会话和客户端的cookies信息
         return jsonify(message="退出" )


      @app.route("/user")
      @login_required # 需要登录的url
      def  show():
         print current_user.username # 这个current_user就是User在当前登录的实例化对象
         return  jsonify(message="用户信息!")