flask web 学习之用户认证与会话管理

文章目录

      • 一、安装及初始化
      • 二、设置用户加载回调函数
      • 三、定义User类
      • 四、实现登陆操作
      • 五、自定义登陆过程
      • 六、使用请求加载器自定义登录
      • 七、匿名用户功能
      • 八、记住我功能

Flask-Login是一个用于处理用户认证和会话管理的Flask插件。它简化了在Flask应用程序中实现用户登录、登出以及保护视图等功能的过程。

一、安装及初始化

flask-login官方文档

pip install flask-login

在flask中进行配置:

from flask import Flask
from flask_login import LoginManagerapp = Flask(__name__)
login_manager = LoginManager()# 初始化LoginManager对象
login_manager.init_app(app)

完成初始化之后,就可以在应用中使用login_manager对象来处理用户认证和会话管理等功能。例如设置用户加载回调函数
保护视图函数等。

二、设置用户加载回调函数

此回调用于从会话中存储的用户ID重新加载用户对象。它应该获取用户的ID,并返回相应的用户对象。例如:

@login_manager.user_loader
def load_user(user_id):# 根据用户 ID 查询用户对象user = User.query.get(int(user_id))return user

三、定义User类

定义 User 类:创建一个 User 类,表示应用程序中的用户,该类需要实现以下几个方法:

  • is_authenticated():返回 True 如果用户已经通过认证,否则返回 False。
  • is_active():返回 True 如果用户是活跃的,否则返回 False。如果用户被禁用,可以返回 False。
  • is_anonymous():返回 True 如果当前用户是匿名用户,否则返回 False。
  • get_id():返回一个唯一标识符的字符串,用于标识用户。
class User:def __init__(self, user_id, username, password):self.id = user_idself.username = usernameself.password = passworddef is_authenticated(self):# 根据你的认证逻辑判断用户是否已经通过认证return True  # 假设用户都已经通过认证def is_active(self):# 根据你的逻辑判断用户是否是活跃的return True  # 假设所有用户都是活跃的def is_anonymous(self):# 根据你的逻辑判断当前用户是否是匿名用户return False  # 假设所有用户都不是匿名的def get_id(self):# 返回一个唯一标识符的字符串,用于标识用户return str(self.id)@staticmethoddef get(user_id):# 从数据库或其他数据源中获取用户对象# 根据用户 ID 查询用户,并返回 User 对象# 如果找不到用户,可以返回 Nonereturn User(user_id, 'username', 'password')

四、实现登陆操作

login_user(user)会自动调用 User 对象中的 is_authenticated()、is_active() 和 get_id() 方法来判断用户是否通过认证、是否活跃以及获取用户的唯一标识符。

@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()# 验证表单if form.validate_on_submit():login_user(user)flask.flash('Logged in successfully.')# 获取名为"next"的查询参数的值next = flask.request.args.get('next')# 检查验证给定的URL是否与当前请求的主机和协议匹配,防止跳转到不受信任的主机或使用不安全的协议。if not url_has_allowed_host_and_scheme(next, request.host):return flask.abort(400)return flask.redirect(next or flask.url_for('index'))return flask.render_template('login.html', form=form)

登陆成功后就可以在模板中使用current_user来获取当前登陆用户了。

{% if current_user.is_authenticated %}Hi {{ current_user.name }}!
{% endif %}

需要进行登陆验证的视图函数可以使用@login_required修饰器来进行装饰。

也可以使用logout_user()方法来退出登陆。

@app.route("/settings")
@login_required
def settings():pass@app.route("/logout")
@login_required
def logout():logout_user()return redirect(somewhere)

五、自定义登陆过程

默认情况下,当用户试图在未登录的情况下访问login_required视图时,Flask login会闪烁一条消息,并将其重定向到登录视图。(如果未设置登录视图,它将中止,并显示401错误。)
所以我们需要设置登录页面的视图函数,并指定登录页面的 URL。

# 自定义未登录消息视图
login_manager.login_view = 'login'
# 自定义未登录消息内容
login_manager.login_message = u"Bonvolu ensaluti por uzi tiun paĝon."
# 自定义未登录消息类别
login_manager.login_message_category = "info"

@login_manager.unauthorized_handler 是 Flask-Login 提供的装饰器,用于定义未经授权用户访问受保护页面时的处理方式。
通过此修饰器能够帮助定制未经授权访问的处理方式,以便提供更好的用户体验和安全性。

@login_manager.unauthorized_handler
def unauthorized_callback():return redirect('/login')

六、使用请求加载器自定义登录

使用请求加载器自定义登录过程。请求加载器允许你根据请求中的信息动态加载用户对象,以满足特定的登录需求。例如获取请求头中的认证信息、查询参数等。

@login_manager.request_loader
def load_user_from_request(request):# 从请求中获取用户标识,例如获取请求头中的认证信息、查询参数等user_id = request.headers.get('Authorization')# 根据用户标识加载用户对象user = User.query.get(user_id)return user

七、匿名用户功能

Flask-Login 提供了匿名用户功能,允许你在未登录的情况下访问受保护的页面。匿名用户对象是一个特殊的 UserMixin 对象,它提供了一些默认的属性和方法,可以模拟已登录用户的行为。

  1. 设置login_manager.anonymous_user属性
login_manager.anonymous_user = Anonymous
  1. 定义匿名对象Anonymous
# 定义匿名用户对象
class Anonymous(AnonymousUserMixin):@propertydef is_authenticated(self):return False

八、记住我功能

"记住我"功能是一种常见的身份验证功能,它允许用户在关闭浏览器后仍然保持登录状态。当用户勾选 “记住我” 选项时,系统会生成一个长期有效的凭证(通常是一个加密的令牌),并在用户下次访问时使用该凭证自动登录用户。
要实现 “记住我” 功能,你可以借助 Flask-Login 提供的 remember_me 参数和相关方法。

@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 验证用户名和密码,并获取用户 IDusername = request.form['username']password = request.form['password']user_id = authenticate(username, password)  # 自定义的验证函数if user_id:# remember 值为 True/Falseremember_me = request.form.get('remember_me')user = get_user(user_id)login_user(user, remember=remember_me)return '登录成功'else:return '用户名或密码错误'    return render_template('login.html')

当用户勾选了 “记住我” 选项后,系统会生成一个长期有效的凭证(通常是一个加密的令牌),并在用户下次访问时使用该凭证自动登录用户,无需再次进行登录操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别再局限于Android和iOS了尝试鸿蒙APP系统开发吧!

最近,多家互联网公司也发布了鸿蒙OS的App开发工程师的岗位,开启了抢人大战,有的企业开出了近百万的年薪招聘鸿蒙OS工程师,而华为甚至为鸿蒙OS资深架构师开出了100万元—160万元的年薪。 「纯血」鸿蒙开启,欲与 Andori…

WEBDYNPRO FPM 框架

框架搭建 1、FPM_OVP_COMPONENT 1 METHOD change_toolbar_btn .2 * enabled "ABAP_TRUE可用 ABAP_FALSE不可用3 * visibility "01不可见 02可见4 DATA: ls_btn TYPE if_fpm_ovp>ty_s_toolbar_button.5 CHECK wd_this->mo_cnr IS BOUND.6 7 TRY .8 …

2011-2022年北大数字普惠金融指数“第五期”(包括省市县)

2011-2022年北大数字普惠金融指数“第五期”(包括省市县) 1、时间:2011-2022年 其中县级的时间为2014-2022年 2、来源:北大数字普惠金融指数 3、范围:全国31省,337个地级市以及2800个县 4、指标&#x…

API调试?试试Apipost

你是否经常遇到接口开发过程中的各种问题?或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心!今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost,并带你深入了解如何玩转它,轻松实现接口测试与调试。 什么是…

面试百问之count(1) 和 count(*) 区别是什么?

count(1) 和 count(*) 是 SQL 中用于统计行数的两种常见方式,它们的区别在于统计的对象不同。 count(1) :这种写法中,括号里的参数并不影响最终的计算结果,常见的用法是传入一个常数值(比如1),因…

linux更新内核

内核介绍 官网链接:https://kernel.org 内核下载库: https://mirrors.edge.kernel.org/pub/linux/kernel/ 更新软件源 rootcary:~# apt-get update rootcary:~# sudo apt-get install libncurses5-dev build-essential kernel-package flex bison libelf-dev libssl-dev 下…

[小脚本] maya 命令行常用操作

其实这些代码大部分是从 chatgpt 中生成的。 骨骼命名 import maya.cmds as cmdsdef rename_bones():selected_bones cmds.ls(type"joint") # 获取选中的骨骼for bone in selected_bones:if "_" in bone:new_name bone.split("_")[0] # 获…

机器学习实验报告——Bayes算法

目录 一、算法介绍 1.1算法背景 1.2算法假设 1.3 贝叶斯与朴素贝叶斯 1.4算法原理 二、算法推导 2.1朴素贝叶斯介绍 2.2朴素贝叶斯算法推导 2.2.1先验后验概率 2.2.2条件概率公式 2.3 独立性假设 2.4 朴素贝叶斯推导 三、算法实现 3.1数据集描述 3.2代码实现 四…

Qt容器QVector

添加元素 QVector<QString> vStarts;//添加元素vStarts <<"张艺兴"; //添加单个元素vStarts <<"鹿晗" <<"热巴"; //添加多个元素vStarts.append("杨紫"); //用append添加元素vStarts.prepend("Angleb…

SpringBoot:Bean生命周期自定义初始化和销毁

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Bean注解指…

如何做好一个信息系统项目经理,一个项目经理的个人体会和经验总结(三)

前言 今天我们继续聊聊在 项目开发阶段&#xff0c;项目经理需要做好的事情 &#x1f603; 二、项目开发阶段&#xff08;续&#xff09; 4. 控制好项目开发质量 要控制好项目开发质量&#xff0c;主要是依赖测试&#xff0c;好的产品都是靠不断地测试&#xff0c;不断地试…

《WebKit 技术内幕》学习之四(3): 资源加载和网络栈

3. 网络栈 3.1 WebKit的网络设施 WebKit的资源加载其实是交由各个移植来实现的&#xff0c;所以WebCore其实并没有什么特别的基础设施&#xff0c;每个移植的网络实现是非常不一样的。 从WebKit的代码结构中可以看出&#xff0c;网络部分代码的确比较少的&#xff0c;它们都在…

西方企业在与中国的竞争中,无可避免地“效仿中国”

长期以来&#xff0c;在西方观察家的视野里&#xff0c;中国科技领域的成功突破主要归结于三大支柱&#xff1a;一是中国建立了完备的基础设施网络&#xff1b;二是大量创新型企业如雨后春笋般涌现&#xff0c;以惊人的速度追赶乃至超越美国硅谷的企业&#xff1b;三是这些创新…

CentOS防火墙基本操作

CentOS操作系统中的防火墙可以使用firewalld或iptables来进行配置。 firewalld&#xff08;默认&#xff09;&#xff1a; 查看当前状态&#xff1a;systemctl status firewalld 开启/关闭防火墙服务&#xff1a;sudo systemctl start/stop firewalld 设置开机自动启动/不启…

【Docker】Docker学习③ - Docker镜像管理

【Docker】Docker学习③ - Docker镜像管理 三、Docker镜像管理1. 搜索镜像2. 下载镜像3. 查看本地镜像4. 镜像导出5. 镜像导入6. 删除镜像7. 容器操作基础命令7.1 从镜像启动一个容器7.2 显示正在运行的容器7.3 显示所有容器7.4 删除运行中的容器7.5 随机映射端口7.6 指定端口映…

wps word 文档里的空白空间太大了

wps word 文档里的空白空间太大了&#xff0c;如下图1 点击【页面】--->【页边距】&#xff0c;把左边、右边的页边距调为0厘米。如下图2 点击【视图】--->【显示比例】从75%改为页宽&#xff0c;页宽的意思是使页面的宽度与窗口的宽度一致。如下图3 图1

浪花 - 用户加入队伍

一、接口设计 1. 请求参数&#xff1a;TeamJoinRequest package com.example.usercenter.model.request;import lombok.Data; import java.io.Serializable;/*** 加入队伍请求参数封装类*/ Data public class TeamJoinRequest implements Serializable {private static final…

用Axure RP 9制作弹出框

制作流程 1.准备文本框 下拉列表 按钮 动态面板 如图 2.先把下拉列表放好 再放动态面板覆盖 3.点动态面板 进入界面 如图 4.给按钮添加交互 3个按钮一样的 如图 5.提交按钮添加交互 如图

linux安装python3.11

yum -y gcc install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel下载地址 https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz 上传python文件&#x…

Kafka(二)【文件存储机制 生产者】

目录 一、Kafka 文件存储机制 二、Kafka 生产者 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 案例演示 2.2、带回调函数的异步发送 2.3、同步发送 API 3、生产者分区 3.1、分区的好处 3.2、生产者发送消息的分区策略 &#xff08;1&am…