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

2024-01-23 01:20

本文主要是介绍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')

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

这篇关于flask web 学习之用户认证与会话管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/634826

相关文章

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.