学习Flask之Flask-Login 用户会话管理

2023-11-19

Flask-Login 用户控制用户会话管理,简单点说,就是控制登录。如果是自己写的登录系统,一般都是通过操作session ,然后后台根据session 来判断权限。Flask-Login 就是负责这部分。直接开始

安装

pip install flask-login

导入LoginManager

from flask_login import LoginManager
#创建一个 login_manager 
login_manager = LoginManager()

#需要提供一个 user_loader 回调。这个回调用于从会话中存储的用户 ID 重新加载用户对象。它应该接受一个用户的 unicode ID 作为参数,并且返回相应的用户对象。

@login_manager.user_loader
def load_user(user_id):
    from epay.models import User
    user = User.query.get(int(user_id))
    return user

用户的类需要实现这些属性和方法:

is_authenticated
当用户通过验证时,也即提供有效证明时返回 True 。(只有通过验证的用户会满足 login_required 的条件。)
is_active
如果这是一个活动用户且通过验证,账户也已激活,未被停用,也不符合任何你 的应用拒绝一个账号的条件,返回 True 。不活动的账号可能不会登入(当然, 是在没被强制的情况下)。
is_anonymous
如果是一个匿名用户,返回 True 。(真实用户应返回 False 。)
get_id()
返回一个能唯一识别用户的,并能用于从 user_loader 回调中加载用户的 unicode 。注意着 必须 是一个 unicode —— 如果 ID 原本是 一个 int 或其它类型,你需要把它转换为 unicode 。
要简便地实现用户类,你可以从 UserMixin 继承,它提供了对所有这些方法的默认 实现。(虽然这不是必须的。)

class User(db.Model,UserMixin):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    created_at = db.Column(db.Date, nullable=True)
    login_date = db.Column(db.Date, nullable=True)

查看登录的逻辑
auth.py

from flask import Blueprint,render_template,request,redirect,url_for,flash
from flask_login import login_user, logout_user, login_required, current_user

from epay.models import User

import hashlib

from epay.forms import UserForm

auth_bp = Blueprint('auth',__name__)

@auth_bp.route('/login',methods=['POST','GET'])
def login():
    form = UserForm()
    if request.method == 'POST':
        email = request.form.get('email')  # args取get方式参数
        
        password = request.form.get('password')
        password = hashlib.md5(password.encode(encoding='utf-8')).hexdigest()
        user = User.query.filter_by(email=email,password=password).first()
        if user:
            flash('Welcome back.', 'info')
            login_user(user)
            return redirect(url_for('admin.index'))
        else:
            flash('Invalid username or password.', 'warning')
            return render_template('auth/login.html',form=form)
    elif request.method == 'GET':
        return render_template('auth/login.html',form=form)


@auth_bp.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('auth.login'))

login.html

<!DOCTYPE html>
<html lang="en">
   <head>
      <!-- basic -->
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <!-- mobile metas -->
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <meta name="viewport" content="initial-scale=1, maximum-scale=1">
      <!-- site metas -->
      <title></title>
      <meta name="keywords" content="">
      <meta name="description" content="">
      <meta name="author" content="">
      <!-- site icon -->
      <link rel="icon" href="{{ url_for('static',filename ='images/fevicon.png') }} " type="image/png" />
      <!-- bootstrap css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='css/bootstrap.min.css') }}" />
      <!-- site css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='style.css') }}" />
      <!-- responsive css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='css/responsive.css') }}" />
      <!-- color css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='css/colors.css') }}" />
      <!-- select bootstrap -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='css/bootstrap-select.css') }}" />
      <!-- scrollbar css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='css/perfect-scrollbar.css') }}" />
      <!-- custom css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='css/custom.css') }}" />
      <!-- calendar file css -->
      <link rel="stylesheet" href="{{ url_for('static',filename ='js/semantic.min.css') }}" />
      <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
      <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
      <![endif]-->
   </head>
   <body class="inner_page login">
      <div class="full_container">
         <div class="container">
            <div class="center verticle_center full_height">
               <div class="login_section">
                  <div class="logo_login">
                     <div class="center">
                        <img width="210" src="{{ url_for('static',filename ='images/logo/logo.png') }}" alt="#" />
                     </div>
                  </div>
                  <div class="login_form">
                     <form action="{{ url_for('auth.login') }}" method="POST">
                        {{ form.csrf_token }}
                        <fieldset>
                           <div class="field">
                              <label class="label_field">Email Address</label>
                              <input type="email" name="email" placeholder="E-mail" />
                           </div>
                           <div class="field">
                              <label class="label_field">Password</label>
                              <input type="password" name="password" placeholder="Password" />
                           </div>
                           <div class="field margin_0">
                              <label class="label_field hidden">hidden label</label>
                              <button class="main_bt">Sing In</button>
                           </div>
                        </fieldset>
                     </form>
                  </div>
               </div>
            </div>
         </div>
      </div>

      <!-- jQuery -->
      <script src="{{ url_for('static',filename ='js/jquery.min.js') }}"></script>
      <script src="{{ url_for('static',filename ='js/popper.min.js') }}"></script>
      <script src="{{ url_for('static',filename ='js/bootstrap.min.js') }}"></script>
      <!-- wow animation -->
      <script src="{{ url_for('static',filename ='js/animate.js') }}"></script>
      <!-- select country -->
      <script src="{{ url_for('static',filename ='js/bootstrap-select.js') }}"></script>
      <!-- nice scrollbar -->
      <script src="{{ url_for('static',filename ='js/perfect-scrollbar.min.js') }}"></script>
      <script>
         var ps = new PerfectScrollbar('#sidebar');
      </script>
      <!-- custom js -->
      <script src="{{ url_for('static',filename ='js/custom.js') }}"></script>

      
      {% for message in get_flashed_messages() %}
         <script>
            alert("{{ message }}")
         </script>
      {% endfor %}

   </body>
</html>

精简一下,当我们判断了账号和密码匹配成功后, 就调用login_user(user)方法,表示系统已经登录了这个用户了。如果在其他路由想判断是否已经登录,在方法前面加上 @login_required,如下:

@admin_bp.route('/')
@admin_bp.route('/index')
@login_required
def index():
    return render_template('admin/index.html')

如果用户尚未登录,就跳转到该路径,就会自动跳回登录页,登录页我们需要配置一下,在初始化 login_manager 的页面:

login_manager.login_view = 'auth.login'

这样就完成了一个简单的配置了,测试模板中就会多出一个默认变量 current_user
如果想在模板直接输出用户名,就可以这样写:
{{ current_user.username }}

更多的操作可以查看以下地址:

http://www.pythondoc.com/flask-login/index.html#id1

(部分解释也是出自以上地址)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习Flask之Flask-Login 用户会话管理 的相关文章

  • 如何避免使用 python 处理空的标准输入?

    The sys stdin readline 返回之前等待 EOF 或新行 所以如果我有控制台输入 readline 等待用户输入 相反 我想打印帮助并在没有需要处理的情况下退出并显示错误 而不是等待用户输入 原因 我正在寻找一个Pytho
  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • Mypy 无法从文字列表推断项目的类型

    我有一个变量x和一个文字列表 例如 0 1 2 我想转换x这些文字之一 如果x在列表中 我将其退回 否则我返回一个后备值 from typing import Literal Set Foo Literal 0 1 2 foos Set F
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 使用 Paramiko 进行 DSA 密钥转发?

    我正在使用 Paramiko 在远程服务器上执行 bash 脚本 在其中一些脚本中 存在与其他服务器的 ssh 连接 如果我只使用 bash 不使用 Python 我的 DSA 密钥将被第一个远程服务器上的 bash 脚本转发并使用 以连接
  • 在 python pandas 中,如何保存“网格图”?

    我对 pandas 绘图工具很陌生 在文档中 以下命令非常方便 myplot rts ret hist bins 50 by rts primary mic 然而 当我尝试从图中获取图形参考并保存它时 问题就出现了 myfigure myp
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • 如何查找或安装适用于 Python 的主题 tkinter ttk

    过去 3 个月我一直在制作一个机器人 仅用代码就可以完美运行 现在我的下一个目标是为它制作一个 GUI 但是我发现了一些障碍 主要的一个是能够看起来不像一个 30 年前的程序 我使用的是 Windows 7 我仅使用 Python 3 3
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 为什么 __dict__ 和 __weakref__ 类从未在 Python 中重新定义?

    类创建似乎从来没有re 定义 dict and weakref class属性 即 如果它们已经存在于超类的字典中 则它们不会添加到其子类的字典中 但始终re 定义 doc and module class属性 为什么 gt gt gt c
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • pandas 中数据帧中的随机/洗牌行

    我目前正在尝试找到一种方法来按行随机化数据框中的项目 我在 pandas 中按列洗牌 排列找到了这个线程 在 pandas 中对 DataFrame 进行改组 排列 https stackoverflow com questions 157
  • python从二进制文件中读取16字节长的双精度值

    我找到了蟒蛇struct unpack 读取其他程序生成的二进制数据非常方便 问题 如何阅读16 字节长双精度数出二进制文件 以下 C 代码将 1 01 写入二进制文件三次 分别使用 4 字节浮点型 8 字节双精度型和 16 字节长双精度型
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • Unity小游戏-勇闯小岛(PC) 项目展示+完整项目源码

    游戏录像 游戏玩法 主角可以变换四种状态 玩家通过四种状态特有的技能来击败眼前的怪物闯关 切换到棕色 有一个一直围绕自己旋转的大摆斧攻击敌人 切换到绿色 可以抵挡一切的投掷物 但是无法攻击敌人 切换到粉色 切换瞬间可以发出飞镖 切换到蓝色
  • gradle 笔记

    1 各种options Simon ZOUYUN PC f AndroidstudioProjects KeyguardTest master gradle help USAGE gradle option task h help Show
  • Linux 进程系统

    Linux 进程系统 守护进程的产生 process namespace namespace 是 Linux 内核用来隔离内核资源的方式 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源 而另外一些进程也只能看到与它们
  • JAVA发展历程

    Java是一门面向对象的编程语言 不仅吸收了C 语言的各种优点 还摒弃了C 里难以理解的多继承 指针等概念 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向对象编程语言的代表 极好地实现了面向对象理论 允许程序员以优
  • c语言之数据结构学习心得

    写在前面 你们好 我是小庄 很高兴能和你们一起学习c语言 如果您对编程感兴趣的话可关注我的动态 写博文是一种习惯 在这过程中能够梳理知识和巩固知识点 一 绪论 1 什么是数据 数据元素 数据项 数据对象 数据结构 1 数据 客观事物的符号表
  • 在eclipse里建立包中包

    工具 原料 工具软件 j2EE eclipse 语言 Java 方法 步骤 1 在src文件夹右击 new package 见下图 2 点击finish 3 在com包右击new package 4
  • 工控上位机程序为什么只能用C语言?

    工控上位机程序并不只能用C 开发 实际上在工业自动化领域中 常见的上位机开发语言包括但不限于以下几种 C C 是一种常用的编程语言 在工控领域中被广泛使用 它具有良好的面向对象特性和丰富的类库支持 可以实现高性能的上位机程序开发 C C C
  • Allegro使用经验笔记

    一 安装 SPB15 2 CD1 3 安装1 2 第3为库 不安装 License安装 设置环境变量Lm license file D Cadencelicense Dat 修改License中SERVER Yyh ANY 5280为SER
  • Typora快捷键大全

    1 字体编辑 1 1 大小 大小 ctr 数字 或 ctr 加减号 或 1 2 加粗 加粗 ctr b 1 3 倾斜 倾斜 ctr i 1 4 下划线 下划线 ctr u 1 5 删除线 删除线 alt shift 5 1 6 上标 上标
  • YOLOv8改进开源

    大致介绍一下AI全栈技术社区的相关内容 主要涵盖了YOLO全系列模型的改进 量化 蒸馏 剪枝以及不同工具链的使用 同时也涵盖多目标跟踪 语义分割 3D目标检测 AI模型部署等内容 具体内容小伙伴们可以参考下面的目录部分 所有内容均有答疑服务
  • 学习-Python字符串之格式化

    第1关 学习 Python字符串之格式化 任务描述 本关任务 给定一个列表 计算列表内所有数据标准差 结果保留小数点后 2 位 相关知识 为了完成本关任务 你需要掌握 的使用 format 的使用 Template 的使用 在之前的实训中
  • 数据分析01——Anaconda安装/Anaconda中的pip换源/jupyter配置

    0 前言 数据分析三大模块知识 numpy 数组计算 pandas 基于numpy开发 用于数据清洗和数据分析 matplotlib 实现数据可视化 1 Anaconda安装 安装Anaconda 注意安装路径不一定是c盘 但是安装目录不要
  • Python Excel操作模块XlsxWriter之写入worksheet.write()

    worksheet write wirte row col args 向工作表单元格写入普通的数据 参数 row 单元格所在的行 索引从0开始计数 col 单元格所在的列 索引从0开始计数 args 传递到子方法的附加参数诸如数字 字符串
  • 端口介绍

    文章来源 https m toutiaocdn com group 6680437870504706572 app news article timestamp 1563010542 req id 201907131735410100230
  • Linux lvm管理讲解及命令

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 前言 目录 一 lvm管理 1 Logical
  • mysql sql优化方法_一个MySql Sql 优化技巧分享

    有天发现一个带inner join的sql 执行速度虽然不是很慢 0 1 0 2 但是没有达到理想速度 两个表关联 且关联的字段都是主键 查询的字段是唯一索引 sql如下 SELECTp item token p item product
  • 如何在小程序实现人脸识别的方法

    1 获取用户授权 在小程序中实现人脸识别需要先获取用户的授权 用户需要允许小程序访问他们的摄像头和图像数据 这样才能进行人脸识别 2 采集图像数据 在获得用户授权后 小程序可以通过摄像头或者相册功能 采集用户的面部图像数据 3 使用图像处理
  • Java-private构造方法

    private 构造函数一般用于Singleton模式 指的是整个应用只有本类的一个对象 一般这种类都有一个类似getInstance 的方法 class A public String name 构造函数限定为private 不可以直接创
  • 标准差(Standard Deviation), 标准误差(Standard error),变异系数 (Coefficient of Variance )的区别与联系

    标准差 Standard Deviation 中文环境中又常称均方差 是离均差平方的算术平均数的平方根 用 表示 标准差是方差的算术平方根 标准差能反映一个数据集的离散程度 平均数相同的两组数据 标准差未必相同 标准误差 Standard
  • 学习Flask之Flask-Login 用户会话管理

    Flask Login 用户控制用户会话管理 简单点说 就是控制登录 如果是自己写的登录系统 一般都是通过操作session 然后后台根据session 来判断权限 Flask Login 就是负责这部分 直接开始 安装 pip insta