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

这篇具有很好参考价值的文章主要介绍了flask web 学习之用户认证与会话管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、安装及初始化

flask-login官方文档

pip install flask-login

在flask中进行配置:

from flask import Flask
from flask_login import LoginManager

app = 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_id
        self.username = username
        self.password = password

    def 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)

    @staticmethod
    def get(user_id):
        # 从数据库或其他数据源中获取用户对象
        # 根据用户 ID 查询用户,并返回 User 对象
        # 如果找不到用户,可以返回 None
        return 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):
    @property
    def is_authenticated(self):
        return False

八、记住我功能

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

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 验证用户名和密码,并获取用户 ID
        username = request.form['username']
        password = request.form['password']
        user_id = authenticate(username, password)  # 自定义的验证函数
        if user_id:
        	# remember 值为 True/False
            remember_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')

当用户勾选了 “记住我” 选项后,系统会生成一个长期有效的凭证(通常是一个加密的令牌),并在用户下次访问时使用该凭证自动登录用户,无需再次进行登录操作。文章来源地址https://www.toymoban.com/news/detail-817910.html

到了这里,关于flask web 学习之用户认证与会话管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 快速实现用户认证:使用Python和Flask配合PyJWT生成与解密Token的教程及示例代码

    这段代码提供了一个使用 Python 和 Flask 结合 JWT (JSON Web Tokens) 进行用户认证的简单框架。它包括了生成 token、解码 token、检查用户状态和一个装饰器函数,用于保护需要认证的路由。下面是对代码的逐部分解释: 1. generate_token(user_id) 函数 这个函数用于为指定的用户 ID 生成一

    2024年02月22日
    浏览(41)
  • [VUE学习]权限管理系统前端vue实现8-右上角用户头像显示实现

               next(‘/logon’) 、 next(to) 或者 next({ …to, replace: true })           在路由守卫中, 只有next()是放行 ,其他的诸如:next(‘/logon’) 、 next(to) 或者 next({ …to, replace: true })都不是放行, 而是:中断当前导航,执行新的导航                 他不是直接放行 二十

    2024年02月13日
    浏览(34)
  • Python web实战之Django用户认证详解

    Python Web 开发、Django、用户认证、实战案例   今天来探讨一下 Django 的用户认证吧!在这篇文章中,我将为大家带来一些有关 Django 用户认证的最佳实践。   在开发 Web 应用程序时,用户认证是一个最常用的功能。它能够确保用户的安全性和隐私,并且为应用程序提供了个性化

    2024年02月14日
    浏览(30)
  • (二)Flask快速上手之用户管理系统

    空讲理论知识记忆不深刻,所以简单的用户管理系统项目带领大家快速直接使用Flask,用的都是很简单的技术点, 重点是session的使用 ,先知道怎么用(因为使用很简单方便),后续会慢慢剖析Flask源码,带大家把Flask扒开看看!!! 在 Flask 中,Session(会话)是一种用于 在不

    2024年02月12日
    浏览(30)
  • 支付宝小程序获取用户授权并进行认证登录流程(前端)

    1.1申请获取用户信息能力     登录功能做之前要先沟通好客户的需求,支付宝小程序获取用户授权调用相应的接口之前要先获得对应的能力。如果需要获取身份证号、手机号、姓名,则需要登录支付宝开放平台,登录企业账号后,在控制台–能力管理–添加“获取会员信

    2024年02月11日
    浏览(40)
  • 从0开始使用flask搭建WEB前端可视化界面

    模板 将其中的 html 结尾的文件放入 template 文件夹,其余的放入 static 文件夹,再创建一个 python 文件使用 flask ,文件结构如下: 以该文件为例: 我们将所有的 html 文件放入 template 文件夹,其他文件夹如 js 、 css 、 vendor 等放入 static 文件夹( assets 直接放入static也可以) 移

    2024年02月01日
    浏览(37)
  • 如何使用Python Flask和MySQL创建管理用户的REST API

    部分数据来源: ChatGPT  引言         在现代化的应用开发中,数据库是一个非常重要的组成部分。关系型数据库(例如:MySQL、PostgreSQL)在这方面尤其是很流行。Flask是一个Python的web框架,非常适合实现REST API。在这篇文章中,我们将介绍如何使用Python Flask和MySQL创建一个

    2024年02月08日
    浏览(53)
  • Ceph:关于 Ceph 用户认证授权管理的一些笔记

    准备考试,整理 Ceph 相关笔记 博文内容涉及, Ceph 用户管理,认证管理,权限管理 以及相关 Demo 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众

    2024年02月11日
    浏览(40)
  • ES X-Pack密码认证与用户管理

    用户数据的安全性一直被人诟病且默认没有密码认证,Elasticsearch在6.8之前官方的X-pack安全认证功能都是收费的,所以很多人都采用Search Guard或者ReadOnly REST这些免费的安全插件对Elasticsearch进行安全认证。从Elasticsearch 6.8开始,Security 纳入 x-pack 的 Basic 版本中,免费使用一

    2024年02月15日
    浏览(27)
  • 关于Open Shift(OKD) 中 用户认证、权限管理、SCC 管理的一些笔记

    因为参加考试,会陆续分享一些 OpenShift 的笔记 博文内容为 openshift 用户认证和权限管理以及 scc 管理相关笔记 学习环境为 openshift v3 的版本,有些旧 这里如果专门学习 openshift ,建议学习 v4 版本 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后

    2023年04月25日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包