返回顶部
首页 > 资讯 > 后端开发 > Python >PythonFlask-Login实现用户会话管理
  • 489
分享到

PythonFlask-Login实现用户会话管理

PythonFlask-LoginPythonFlask-Login会话管理 2022-12-09 12:12:33 489人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

flask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。 Flask-Login 不绑定到任何特定的数据库系统或权限模型。唯一的要求

flask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。

Flask-Login 不绑定到任何特定的数据库系统或权限模型。唯一的要求是您的 用户对象实现一些方法,并且您向能够 从用户 ID 加载用户 的扩展提供回调。

GitHubhttps://github.com/maxcountryman/flask-login

LoginManager 是一个类,有多个方法和属性;该类初始化的对象用于保存用于登录的设置。LoginManager 实例不绑定到特定应用程序,因此可以在代码的主体中创建一个,然后将其绑定到您的应用程序 app 中工厂函数。

  • login-view:验证失败跳转的界面。
  • login-message:用户重定向到登录页面时闪出的消息。
  • refresh-view:用户需要重新进行身份验证时要重定向到的视图的名称。
  • needs-refresh-message:用户重定向到 “需要刷新” 页面时闪出的消息。
  • session-protection:使用会话保护的模式。这可以是 basic(默认)或 strong,或 None 禁用。
class LoginManager:
    def __init__(self, app=None, add_context_processor=True):
        #: A class or factory function that produces an anonymous user, which
        #: is used when no one is logged in.
        self.anonymous_user = AnonymousUserMixin
        #: The name of the view to redirect to when the user needs to log in.
        #: (This can be an absolute URL as well, if your authentication
        #: Machinery is external to your application.)
        self.login_view = None
        #: Names of views to redirect to when the user needs to log in,
        #: per blueprint. If the key value is set to None the value of
        #: :attr:`login_view` will be used instead.
        self.blueprint_login_views = {}
        #: The message to flash when a user is redirected to the login page.
        self.login_message = LOGIN_MESSAGE
        #: The message cateGory to flash when a user is redirected to the login
        #: page.
        self.login_message_category = LOGIN_MESSAGE_CATEGORY
        #: The name of the view to redirect to when the user needs to
        #: reauthenticate.
        self.refresh_view = None
        #: The message to flash when a user is redirected to the 'needs
        #: refresh' page.
        self.needs_refresh_message = REFRESH_MESSAGE
        #: The message category to flash when a user is redirected to the
        #: 'needs refresh' page.
        self.needs_refresh_message_category = REFRESH_MESSAGE_CATEGORY
        #: The mode to use session protection in. This can be either
        #: ``'basic'`` (the default) or ``'strong'``, or ``None`` to disable
        #: it.
        self.session_protection = "basic"
		......

user_loader:自定义回调函数。这将设置从会话重新加载用户的回调。您设置的函数应该使用 用户 ID(“unicode”)并返回用户对象,如果用户不存在则返回 “None”。源码如下:

def user_loader(self, callback):
        """
        This sets the callback for reloading a user from the session. The
        function you set should take a user ID (a ``str``) and return a
        user object, or ``None`` if the user does not exist.
        :param callback: The callback for retrieving a user object.
        :type callback: callable
        """
        self._user_callback = callback
        return self.

自定义回调函数。在执行下面这段代码之后,注册了 load_user() 这个自定义的 callback

@login_manager.user_loader
def load_user(userid):
    return User.get(userid)

utils

  • login_required:如果使用此装饰视图,它将确保在调用实际视图之前登录并验证当前用户。如果验证不通过,那么则会调用 LoginManager.unauthorized()
  • login_user:记录 / 保存当前成功登陆的用户。
  • logout_user:登出功能类似,除了基本的操作外,还需要把 flask-login 中的登出进行操作。

UserMixin:要简便地实现用户类,你可以从 UserMixin 继承,它提供了对下列这些方法的默认实现。(虽然这不是必须的。)

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

Flask-Login 一般使用基础流程

Flask-Login 通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user)。

login_user():实现用户的登入,一般在登入的视图函数中调用。

logout_user():实现登出功能。

current_user 属性:获取当前用户。

如果需要页面是授权用户才可见,在相应视图函数前加上 @login_required 装饰器进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到 LoginManager.login_view 所指定的视图。

实战

首先,我们将设置一个 Flask 应用程序:

import flask
app = flask.Flask(__name__)
app.secret_key = 'super secret string'  # Change this!

Flask-Login 通过登录管理器工作。首先,我们将通过实例化登录管理器并告诉它我们的 Flask 应用程序来设置登录管理器:

import flask_login
login_manager = flask_login.LoginManager() # 初始化一个 LoginManager 类对象
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Access denied.'
login_manager.init_app(app) # 配置该对象

为了简单起见,我们将使用字典来表示用户数据库。在实际应用程序中,这将是一个实际的持久层。然而,重要的是要指出这是 Flask-Login 的一个特性:它不关心你的数据是如何存储的,只要你告诉它如何检索它!

# Our mock database.
users = {'foo@bar.tld': {'passWord': 'secret'}}

我们还需要告诉 Flask-Login 如何从 Flask 请求及其会话中 加载用户。为此,我们需要定义我们的用户对象、一个 user_loader 回调和一个 request_loader 回调。

class User(flask_login.UserMixin):
    pass
@login_manager.user_loader
def user_loader(email):
    if email not in users:
        return
    user = User()
    user.id = email
    return user
@login_manager.request_loader
def request_loader(request):
    email = request.fORM.get('email')
    if email not in users:
        return
    user = User()
    user.id = email
    return user

现在我们准备定义我们的观点。我们可以从登录视图开始,它将使用身份验证位填充会话。之后我们可以定义一个需要身份验证的视图。

@app.route('/login', methods=['GET', 'POST'])
def login():
    if flask.request.method == 'GET':
        return '''
               <form action='login' method='POST'>
                <input type='text' name='email' id='email' placeholder='email'/>
                <input type='password' name='password' id='password' placeholder='password'/>
                <input type='submit' name='submit'/>
               </form>
               '''
    email = flask.request.form['email']
    if email in users and flask.request.form['password'] == users[email]['password']:
        user = User()
        user.id = email
        flask_login.login_user(user)
        return flask.redirect(flask.url_for('protected'))
    return 'Bad login'
@app.route('/protected')
@flask_login.login_required
def protected():
    return 'Logged in as: ' + flask_login.current_user.id

最后,我们可以定义一个视图来清除会话并将用户注销。

@app.route('/logout')
def logout():
    flask_login.logout_user()
    return 'Logged out'

我们现在有了一个基本的工作程序,它使用了基于会话的认证。为了使事情圆满结束,我们应该为登录失败提供一个回调。

@login_manager.unauthorized_handler
def unauthorized_handler():
    return 'Unauthorized', 401

到此这篇关于python Flask-Login实现用户会话管理的文章就介绍到这了,更多相关Python Flask-Login内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PythonFlask-Login实现用户会话管理

本文链接: https://lsjlt.com/news/174622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PythonFlask-Login实现用户会话管理
    Flask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。 Flask-Login 不绑定到任何特定的数据库系统或权限模型。唯一的要求...
    99+
    2022-12-09
    Python Flask-Login Python Flask-Login会话管理
  • Java JSP 会话管理:维护用户状态
    会话的作用 会话管理通过创建一个会话对象来实现,该对象存储与特定用户相关的特定数据。此数据可以包括用户偏好、身份验证信息和购物车项目。会话对象在整个会话期间都存在,即使用户关闭浏览器或切换到不同的页面也是如此。 会话创建 当用户首次请求一...
    99+
    2024-03-15
    JSP
  • 利用Redis实现分布式会话管理
    利用Redis实现分布式会话管理随着互联网的发展,分布式系统已经成为了现代化系统架构中的重要组成部分之一。而在分布式系统中,会话管理一直是一个重要的课题。传统的会话管理往往借助于本地内存或数据库来存储会话数据,但这些方式在分布式环境下无法满...
    99+
    2023-11-07
    管理 redis 分布式会话
  • 使用redis管理用户登录会话的方法
    登录和cookie缓存 对于用来登录的cookie,有两种常见的方法可以将登录信息存储在cookie里面:一种是签名(signed)cookie,另一种是令牌(token)cookie。 签名cookie通...
    99+
    2024-04-02
  • Redis如何实现分布式会话管理
    Redis如何实现分布式会话管理,需要具体代码示例分布式会话管理是当下互联网热门话题之一,面对高并发、大数据量的场景,传统的会话管理方式逐渐显得力不从心。Redis作为一个高性能的键值数据库,提供了分布式会话管理的解决方案。本文将介绍如何使...
    99+
    2023-11-07
    分布式 redis 会话管理
  • 如何处理用户的会话管理知识点问题?
    ...
    99+
    2024-04-03
    SessionManagement Cookie BestPractices Security Challenges
  • Tmux中怎么实现多会话终端管理
    本篇文章为大家展示了Tmux中怎么实现多会话终端管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux 下安装 tmuxTmux 可以在绝大多数的 Linux 官方仓库下获取。在 Arch L...
    99+
    2023-06-15
  • 如何使用Redis和PHP开发用户会话管理功能
    如何使用Redis和PHP开发用户会话管理功能导语:用户会话管理是Web应用开发中一个重要的功能,它可以帮助我们追踪和管理用户登录状态,同时提供安全的身份验证和授权功能。在本文中,我们将介绍如何使用Redis和PHP来实现用户会话管理功能,...
    99+
    2023-10-22
    PHP redis 会话管理
  • 如何使用Redis和C#开发用户会话管理功能
    如何使用Redis和C#开发用户会话管理功能引言:在现代Web应用程序中,用户会话管理是一个非常重要的功能。它可以帮助我们追踪和管理用户的登录状态,确保用户的身份信息得到保护。而 Redis 是一个流行的高性能键值数据库,它提供了各种功能来...
    99+
    2023-10-22
    C# (编程语言) Redis (数据存储) 用户会话管理 (功能需求)
  • ASP.NET中怎么实现状态管理和会话存储
    在ASP.NET中,可以使用以下方法来实现状态管理和会话存储: ViewState:ViewState是用于在页面间保持状态的一...
    99+
    2024-05-09
    ASP.NET
  • shiro框架04会话管理+缓存管理+Ehcache使用
    目录 一、会话管理 1.基础组件 1.1 SessionManager 1.2 SessionListener 1.3 SessionDao 1.4 会话验证 1.5 案例 二、缓存管理 1、为什么要使用缓存 2、什么是ehcache 3、...
    99+
    2023-10-10
    缓存 java 开发语言
  • PHP框架中的用户会话管理:安全、高效、定制化
    php框架通过加密会话id、https传输和会话超时确保会话安全性。通过会话缓存、压缩和按需存储优化会话效率。框架提供定制化选项,包括会话存储驱动、会话配置和会话数据管理。 PHP框架...
    99+
    2024-05-23
    php 用户会话管理 laravel
  • MySQL中 kill会话的实现原理
    这篇文章主要介绍“MySQL中 kill会话的实现原理”,在日常操作中,相信很多人在MySQL中 kill会话的实现原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQ...
    99+
    2024-04-02
  • PHP 代码安全:会话管理的最佳实践
    安全会话管理最佳实践:创建会话:使用 session_start() 函数;会话标识符:设置 cookie 安全属性、定期更新 sid,避免存储在数据库中;实战案例:购物车存储:使用 s...
    99+
    2024-05-11
    php 代码安全
  • MySQL如何实现用户账户管理
    这篇文章主要为大家展示了“MySQL如何实现用户账户管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL如何实现用户账户管理”这篇文章吧。 MySQL...
    99+
    2024-04-02
  • Mysql 用户权限管理实现
    1. MySQL 权限介绍 mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,我当前的版本mysql 5.7.22 。 mysql权限表的验证过程为: ...
    99+
    2022-05-25
    Mysql 用户权限管理
  • Java实现用户管理系统
    基于Java的简单的用户管理系统,供大家参考,具体内容如下 此系统功能和方法都比较简单 本次系统通过控制台输入商品的基本信息,加入管理员的登录与对是否为管理员进行操作 对于功能的实现...
    99+
    2024-04-02
  • C#怎么实现用户管理
    这篇文章主要介绍了C#怎么实现用户管理的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么实现用户管理文章都会有所收获,下面我们一起来看看吧。开始:一、用户关注与退订事件:在之前的消息处理中,我们在UserM...
    99+
    2023-07-02
  • javascript实现用户管理系统
    本文实例为大家分享了javascript实现用户管理系统的具体代码,供大家参考,具体内容如下 一些知识点梳理: 1.获取ta1表格中的某行某列的元素 document.getElem...
    99+
    2024-04-02
  • JS实现用户管理系统
    本文实例为大家分享了JS实现用户管理系统的具体代码,供大家参考,具体内容如下 效果图: html代码:   <h1>新增学员</h1> ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作