Python Flask-Login实现用户会话管理

 更新时间:2022年12月09日 09:21:14   作者:皮皮要HAPPY  
这篇文章主要介绍了Python Flask-Login实现用户会话管理过程,Flask-Login为Flask提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务

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

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

GitHub:https://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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 跟老齐学Python之不要红头文件(2)

    跟老齐学Python之不要红头文件(2)

    在前面学习了基本的打开和建立文件之后,就可以对文件进行多种多样的操作了。请看官要注意,文件,不是什么特别的东西,就是一个对象,如同对待此前学习过的字符串、列表等一样。
    2014-09-09
  • Python实现KNN(K-近邻)算法的示例代码

    Python实现KNN(K-近邻)算法的示例代码

    这篇文章主要介绍了Python实现KNN(K-近邻)算法的示例代码,它主要用于对事物进行分类。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Python try-except-else-finally的具体使用

    Python try-except-else-finally的具体使用

    本文主要介绍了Python try-except-else-finally的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Python 使用office365邮箱的示例

    Python 使用office365邮箱的示例

    这篇文章主要介绍了Python 使用office365邮箱的示例,帮助大家利用python进行高效办公,感兴趣的朋友可以了解下
    2020-10-10
  • Python TCP接收数据不全的问题解决

    Python TCP接收数据不全的问题解决

    本文主要介绍了Python TCP接收数据不全的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • python爬虫模拟浏览器的两种方法实例分析

    python爬虫模拟浏览器的两种方法实例分析

    这篇文章主要介绍了python爬虫模拟浏览器的两种方法,结合实例形式分析了Python爬虫模拟浏览器的两种常见操作技巧与使用注意事项,需要的朋友可以参考下
    2019-12-12
  • Python中的浮点数原理与运算分析

    Python中的浮点数原理与运算分析

    这篇文章主要介绍了Python中的浮点数原理与运算分析,结合实例形式分析了Python浮点数操作的常见错误,并简单解释了浮点数运算的原理与比较运算实现方法,需要的朋友可以参考下
    2017-10-10
  • django中间件及自定义中间件的实现方法

    django中间件及自定义中间件的实现方法

    中间件就是在目标和结果之间进行的额外处理过程,在Django中就是request和response之间进行的处理,相对来说实现起来比较简单,这篇文章主要介绍了django中间件以及自定义中间件 ,需要的朋友可以参考下
    2023-06-06
  • python爬取内容存入Excel实例

    python爬取内容存入Excel实例

    这篇文章主要为大家详细介绍了python爬取内容存入Excel实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Python数据可视化Pyecharts库的使用教程

    Python数据可视化Pyecharts库的使用教程

    pyecharts是一个用于生成echarts图表的类库。echarts是百度开源的一个数据可视化库,用echarts生成的图可视化效果非常棒。使用pyechart库可以在python中生成echarts数据图。本文将详细介绍一下Pyecharts库的使用,需要的可以参考一下
    2022-02-02

最新评论