当前位置: 首页 > article >正文

一文学会Flask-Login

Flask-Login是一个用于Flask应用程序的用户认证库。它提供了简单易用的API,用于处理用户的登录和注销,并提供了保护路由的功能。

一、Flask-Login的主要功能包括:

  1. 用户登录:Flask-Login提供了UserMixin类,用于表示用户模型。开发者只需要继承UserMixin,并实现必要的方法(如get_id()、is_authenticated()等),就能轻松地为用户建立登录功能。

  2. 用户认证:Flask-Login提供了login_required装饰器,用于保护需要登录才能访问的路由。当用户未登录时,Flask-Login会将其重定向到登录页面。

  3. 记住我功能:Flask-Login支持"记住我"功能,用户可以选择在关闭浏览器后仍然保持登录状态。开发者只需要设置REMEMBER_COOKIE_DURATION配置项即可。

  4. 用户注销:Flask-Login提供了logout_user()函数,用于处理用户注销的逻辑。开发者只需要调用该函数,即可清除用户的登录状态。

二、Flask-Login的使用步骤如下:

  1. 安装Flask-Login库:使用pip命令安装Flask-Login库。

  2. 创建用户模型:创建一个用户模型,继承UserMixin类,并实现必要的方法。

  3. 初始化Flask-Login:在Flask应用程序中,使用LoginManager类初始化Flask-Login。

  4. 创建登录视图:创建一个处理用户登录的视图函数,使用login_user()函数来登录用户。

  5. 创建注销视图:创建一个处理用户注销的视图函数,使用logout_user()函数来注销用户。

  6. 保护路由:使用login_required装饰器,保护需要登录才能访问的路由。

  7. 创建登录页面:创建一个登录页面的HTML模板,包含登录表单。

三、Flask-Login的使用示例:

  1. 安装Flask-Login:

    pip install flask-login
    
  2. 创建了一个LoginManager对象,并将其与应用关联起来,设置登录视图的名称为login

    # 创建LoginManager对象
    login_manager = LoginManager(app)
    
    # 设置登录视图, 
    # 在访问需要登录的视图时(加了@login_required的函数)
    # 如果没登录则重定向到`login`页面
    login_manager.login_view = 'login'
    
  3. 定义一个User模型,继承UserMixin类,实现一个get方法用于根据用户id查询用户信息

    # 定义User模型
    class User(UserMixin):
        def __init__(self, id):
            self.id = id
    
        @staticmethod
        def get(id):
            # 根据用户id查询用户信息
            # 这个方法根据你的具体实现而定
            return User(id)
    
  4. 使用@login_manager.user_loader装饰器加载用户的回调函数,用于根据用户id加载用户

    # 根据用户id加载用户
    @login_manager.user_loader
    def load_user(user_id):
        return User.get(user_id)
    
  5. 定义一个login视图,用于处理用户的登录操作。在示例中,我们简单地创建了一个User对象,并使用login_user函数将用户登录

    # 定义登录视图
    @app.route('/login')
    def login():
        user = User(1)
        login_user(user)
        return 'Logged in successfully'
    
  6. 定义一个logout视图,用于处理用户的登出操作。在示例中,我们使用logout_user函数将用户登出。

    # 定义登出视图
    @app.route('/logout')
    @login_required	
    def logout():
        logout_user()
        return 'Logged out successfully'
    
  7. 定义一个受保护的视图protected,使用了@login_required装饰器来保证只有登录的用户才能访问

    # 定义受保护的视图
    @app.route('/protected')
    @login_required
    def protected():
        return 'Protected content'
    
  8. 完整代码

    from flask import Flask
    from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'your_secret_key'
    
    # 创建LoginManager对象
    login_manager = LoginManager(app)
    
    # 设置登录视图
    login_manager.login_view = 'login'
    
    # 定义User模型
    class User(UserMixin):
        def __init__(self, id):
            self.id = id
    
        @staticmethod
        def get(id):
            # 根据用户id查询用户信息
            # 这个方法根据你的具体实现而定
            return User(id)
    
    # 根据用户id加载用户
    @login_manager.user_loader
    def load_user(user_id):
        return User.get(user_id)
    
    # 定义登录视图
    @app.route('/login')
    def login():
        user = User(1)
        login_user(user)
        return 'Logged in successfully'
    
    # 定义登出视图
    @app.route('/logout')
    @login_required
    def logout():
        logout_user()
        return 'Logged out successfully'
    
    # 定义受保护的视图
    @app.route('/protected')
    @login_required
    def protected():
        return 'Protected content'
    
    if __name__ == '__main__':
        app.run()
    

四、总结

  • LoginManager:登录管理对象
  • UserMixin:用户类需要继承这个,里面提供一些用户状态
  • login_user:用户登录后,将用户加入LoginManager进行管理
  • logout_user:用户登出之后,从LoginManager中注销用户信息
  • login_required:检查是否需要登录,在需要登录的视图上添加

http://www.kler.cn/news/294273.html

相关文章:

  • 12. 如何在MyBatis中进行分页查询?常见的分页实现方式有哪些?
  • MySQL的服务器与客户端:架构解析与实践
  • 人工智能训练师边缘计算实训室解决方案
  • 当水泵遇上物联网:智能水务新时代的浪漫交响
  • spring boot项目中配置文件配置mapper*.xml文件路径无效的问题排查记录
  • Vatee万腾平台:科技赋能,开启企业数字化转型新篇章
  • 生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute
  • Codeforces Round 971 (Div. 4) (A~G1)
  • 字节6面,面爆炸了
  • 智慧公厕技术应用、系统架构、应用功能有哪些?@卓振思众
  • C#中LINQ的Cast<T>与OfType<T>
  • DevOps学习笔记
  • 基于SpringBoot+Vue+MySQL的校园周边美食探索及分享平台
  • 初识jQuery
  • Android 15 新特性快速解读指南
  • 使用bert_base_chinese实现文本语义相似度计算
  • Spring Boot-自定义banner
  • 视频提取字幕的软件有哪些?高效转录用这些
  • react的useRef作用是什么怎么使用
  • Android Camera系列(一):SurfaceView+Camera
  • 数据结构,单向链表
  • 【2024高教社杯全国大学生数学建模竞赛】B题完整解析(含论文、代码分享)
  • 7个 C# 高阶用法详解:从基础到实战
  • 微信小程序实践案例
  • Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求
  • 智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1
  • 机械学习—零基础学习日志(概率论总笔记4)
  • JAVA基础:JVM中方法的执行过程和方法的重载,递归,可变参数的含义
  • MySQL——视图(一)视图概述
  • 59.以太网数据回环实验(2)硬件资源梳理及系统框图