当前位置:主页 > python教程 > Python flask-login 模块

Python flask 框架使用flask-login 模块的详细过程

发布:2023-04-29 08:15:01 59


给大家整理一篇相关的编程文章,网友简志勇根据主题投稿了本篇教程内容,涉及到Python、flask-login、模块、Python、flask、框架、Python flask-login 模块相关内容,已被150网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

Python flask-login 模块

flask-login 模块简介

Flask-Login 是一个 Flask 模块,可以为 Flask 应用程序提供用户登录功能。要在 Flask 应用程序中使用 Flask-Login,需要先安装它:

pip install flask-login

这了有个小细节需要注意,模块安装都使用中划线(-),模块使用时用下划线 _

在应用程序中导入并初始化 Flask-Login

from flask import Flask
from flask_login import LoginManager
app = Flask(__name__)
login_manager = LoginManager(app)

上述代码中提及了 LoginManager 类,该类是 Flask-Login 提供的主要入口点,用于管理用户登录状态。在你的 Flask 应用程序中初始化它。

然后我们可以使用 init_app() 函数来初始化 LoginManager 实例并绑定到指定的 Flask 应用上。这样就可以在应用程序中使用该实例来管理用户登录状态。

一些常用的配置项:

  • login_view: 登录页面的名称或路由,默认为 'login';
  • session_protection : 一个字符串,定义 session 保护级别,可用的值为 'basic' , 'strong' , 'None';
  • user_callback: 当未登录时被调用的回调函数;
  • unauthorized_callback: 当未登录且 session_protection != None 时被调用的回调函数;
  • login_message:用户未登录时显示的消息;
  • login_message_category:消息类别,默认是 ‘message’;

在上面的示例中,我们没有指定登录页面,系统会默认使用 “login” 作为登录页面,如果需要指定其他页面,可以在初始化后设置 login_view 属性。

login_manager.login_view = 'your_login_route'

展示一下完整示例代码。

from flask import Flask, render_template, redirect, url_for, request
from flask_login import LoginManager, login_user, logout_user, login_required

app = Flask(__name__)
login_manager = LoginManager(app)
@login_manager.user_loader
def load_user(user_id):
    # 加载用户
    user = list()
    return user
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 登录校验代码
        username = request.form['username']
        password = request.form['password']
        user = load_user(username)
        # 注意 user.verify_password 是自定义函数,用来校验密码是否正确
        if user and user.verify_password(password):
            login_user(user)
            return redirect(url_for('home'))
    return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('home'))

Flask-Login 模块的上手细节

user_loader 函数

user_loader() 函数是 Flask-Login 提供的一个装饰器,用来设置一个回调函数,用来加载用户。这个函数需要接收一个用户 ID 作为参数,并返回一个用户对象。

@login_manager.user_loader
def load_user(user_id):
    # 从数据库或者其他存储位置 读取用户信息
    user = list()
    return user

使用了该装饰器之后,每当 Flask-Login 需要加载用户时,都会调用这个回调函数,并传入用户 ID 作为参数。该函数应该根据用户 ID 从数据库或其他存储中加载用户,并返回用户对象。如果没有找到用户,则应该返回 None。

需要注意的是,该函数默认接收一个参数,就是用户的 ID。如果要接收其他参数,可以通过闭包(closure)或者全局变量来传递参数,例如下面这种方式:

some_variable = 'xiangpica'

@login_manager.user_loader
def load_user(user_id):
    return User.query.filter_by(id=user_id,name=some_variable).first()

另外还可以再次封装函数然后传入参数,例如:

def user_loader_fn(some_variable):
    @login_manager.user_loader
    def load_user(user_id):
        return User.query.filter_by(id=user_id,some_variable=some_variable).first()
    return load_user

some_variable = 'xiangpica'
load_user = user_loader_fn(some_variable)

login_user 函数

该函数是 Flask-Login 提供的一个函数,用来登录用户。这个函数需要接受一个用户对象作为参数。

在上面的示例代码中,当验证用户密码成功后,会调用 login_user(user) 函数登录用户。这个函数会将用户对象存储到会话中,并标记用户已经登录。在后续的请求中,可以使用 current_user 变量来访问当前登录的用户。

login_user() 函数原型如下:

login_user(user, remember=False, duration=None, force=False, fresh=True)

其参数说明如下:

  • remember:布尔值,表示是否记住用户,默认 False;
  • duration:datetime.timedelta 对象,用户登录的时间,默认为 None;
  • force:布尔值,表示是否强制登录用户,即使用户已经登录,默认为 False;
  • fresh:布尔值,表示用户登录后是否需要获取新的权限, 默认为 True。

这个函数在登录用户之后会在 session 中记录用户的状态,使得之后的请求都能识别出这个用户已经登录。

login_user() 函数还会在用户登录后设置一个 cookie, 以便在后续请求中识别用户身份。这个 cookie 的名称是 remember_token, 如果你指定了 remember=True,则会将该 cookie 的过期时间设置为 REMEMBER_COOKIE_DURATION, 否则将在会话结束后过期。

logout_user 函数

该函数是 Flask-Login 提供的一个函数,用来注销当前登录的用户。这个函数无需接受任何参数,因为它会清除当前会话中存储的用户信息。

使用方法很简单,只需要在需要注销的地方直接调用 logout_user() 函数即可。

from flask_login import logout_user
@app.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('index'))

调用 logout_user() 函数会删除会话中存储的用户信息,并且会删除 remember_token 的 cookie, 从而使用户登出。

在注销用户后,应用程序应重定向用户到登录页面或主页面。用户注销后,可以使用 current_user 变量来确定用户是否已经注销。如果用户已经注销,则 current_user 是一个匿名用户。

confirm_login 函数

该函数是 Flask-Login 提供的一个函数,用于确认用户登录状态。在某些场景中,用户可能被提示登录后才能执行某些操作。在这种场景中,可以使用 confirm_login() 函数来确认用户是否已经登录。

该函数需要接收一个参数,是当前登录用户的 ID。当用户登录后,会在会话中存储用户 ID。如果用户已经登录,则会话中会有 user_id 的值,该函数会根据这个值来确认用户是否已经登录。

from flask_login import confirm_login
@app.route('/school')
def settings():
    if not confirm_login():
        return redirect(url_for('login'))
    return render_template('school.html')

这样就可以在访问 “/settings” 路径时确认用户是否已经登录,如果没有登录则重定向到登录页面。

这里需要注意:如果在用户登录之后没有将用户 ID 记录到会话中,那么 Flask-Login 的 confirm_login() 函数就无法确认用户是否已经登录。

unauthorized_callback 函数

该函数用于在用户访问被保护的视图函数时被拒绝授权时被调用。回调函数默认是 None,如果你设置了该回调函数, 则在用户未登录或者没有权限访问时,会调用这个函数。

默认的 Flask-Login 实现会抛出一个 unauthorized 的异常,你可以在回调函数里面定制自己的错误处理. 例如:

from flask_login import LoginManager
login_manager = LoginManager()

@login_manager.unauthorized_handler
def unauthorized():
    return '登录后访问该页面'

上面的代码在访问被保护视图时会自动调用 unauthorized() 函数,返回 '登录后访问该页面' 错误信息。

needs_refresh_callback 函数

该函数在用户的认证信息需要刷新时会被调用,默认返回值是 None。
当用户登录后, 一般会在会话中存储一些用户信息, 比如用户名, 角色等等。当用户认证信息有变化时, 例如用户角色被更新了,就需要重新加载用户信息。

如果你设置了 needs_refresh_callback 函数,当用户的认证信息需要刷新时, 会调用这个函数来重新加载用户信息。

from flask_login import LoginManager
login_manager = LoginManager()

@login_manager.unauthorized_handler
def unauthorized():
    return '登录后访问该页面'

login_required 装饰器

该装饰器用来保护视图函数,确保只有登录用户才能访问。如果一个用户没有登录,将会重定向到登录页面。
使用方法很简单,只需要在需要保护的视图函数的前面加上 @login_required 即可。例如:

from flask_login import login_required

@app.route('/school')
@login_required
def settings():
    return render_template('school.html')

默认情况下, 重定向地址是 login, 如果你有其他路径名称,可以使用 login_url 参数来设置重定向地址。例如:

@app.route('/school')
@login_required(login_url='/signin')
def settings():
    return render_template('school.html')

还可以使用 next 参数来设置登录成功后的重定向地址。例如:

@app.route('/login', methods=['GET', 'POST'])
def login():
    next = request.args.get('next')
    if request.method == 'POST':
        # check login
        login_user(user)
        return redirect(next or url_for('index'))
    return render_template('login.html', next=next)

这样在登录成功后会重定向回之前的页面。

flask_login模块

flask-login为flask提供了用户会话管理。他处理了日常的登入,登出并且长时间记住用户的会话。

  • 在会话中存储当前活跃的用户ID让你能够自由地登入和登出。

  • 让你限制登入或登出,用户可以访问的试图。

  • 处理让人棘手的记住我功能。

  • 帮助你保护用户会话免遭cookie被盗的牵连。

  • .可以与以后可能使用的flask-principal或其他认证扩展集成。

到此这篇关于Python flask 框架使用 flask-login 模块的文章就介绍到这了,更多相关Python flask-login 模块内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • Python学习之利用scapy实现ARP欺骗

    发布:2020-03-18

    今天小编就为大家分享一篇Python利用scapy实现ARP欺骗的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


  • python3实现ftp服务功能的实例内容

    发布:2021-05-10

    这篇文章主要为大家详细介绍了python3实现ftp服务功能,客户端的相应代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • python删除txt文件的实例方法

    发布:2020-01-12

    第一步:先找到txt文件的路径。||第二步:导入os模块,使用os下的remove命令来删除该文件,通常路径字符串都是用r字符串。||第三步:使用path.exists命令来检验该文件是否存在。||第四步:如果


  • PHP与Python代码语法差异整理

    发布:2020-05-15

    这篇文章主要介绍了通过PHP与Python代码对比浅析语法差异,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • python语法实现单向循环链表

    发布:2020-01-18

    ​之前的学习中都是用C语言编写的链表实现,今天小编将带大家一起来学习用python编写单向循环链表。


  • python实现无限循环的实例代码

    发布:2020-04-20

    Python中的循环语句有 for 和 while,让循环条件永远为ture,循环将无限的执行下去。


  • Python 使用 pip 安装 matplotlib 模块的方法

    发布:2023-04-01

    matplotlib是python中强大的画图模块,这篇文章主要介绍了Python 使用 pip 安装 matplotlib 模块(秒解版),本文给大家介绍的非常详细,需要的朋友可以参考下


  • 《Python并行编程参考手册》书评、笔记、下载

    发布:2019-07-11

    在本篇内容里小编给各位分享了关于《Python并行编程参考手册》这本书的书评、学习笔记以及电子书下载的相关内容,有兴趣的朋友们阅读下吧。


网友讨论