文章目录
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_loaderdefload_user(user_id):# 加载用户
user =list()return user
@app.route('/login', methods=['GET','POST'])deflogin():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_requireddeflogout():
logout_user()return redirect(url_for('home'))
Flask-Login 模块的上手细节
user_loader 函数
user_loader()
函数是 Flask-Login 提供的一个装饰器,用来设置一个回调函数,用来加载用户。这个函数需要接收一个用户 ID 作为参数,并返回一个用户对象。
@login_manager.user_loaderdefload_user(user_id):# 从数据库或者其他存储位置 读取用户信息
user =list()return user
使用了该装饰器之后,每当 Flask-Login 需要加载用户时,都会调用这个回调函数,并传入用户 ID 作为参数。该函数应该根据用户 ID 从数据库或其他存储中加载用户,并返回用户对象。如果没有找到用户,则应该返回 None。
需要注意的是,该函数默认接收一个参数,就是用户的 ID。如果要接收其他参数,可以通过闭包(closure)或者全局变量来传递参数,例如下面这种方式:
some_variable ='xiangpica'@login_manager.user_loaderdefload_user(user_id):return User.query.filter_by(id=user_id,name=some_variable).first()
另外还可以再次封装函数然后传入参数,例如:
defuser_loader_fn(some_variable):@login_manager.user_loaderdefload_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')deflogout():
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')defsettings():ifnot 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_handlerdefunauthorized():return'登录后访问该页面'
上面的代码在访问被保护视图时会自动调用
unauthorized()
函数,返回
'登录后访问该页面'
错误信息。
needs_refresh_callback 函数
该函数在用户的认证信息需要刷新时会被调用,默认返回值是 None。
当用户登录后, 一般会在会话中存储一些用户信息, 比如用户名, 角色等等。当用户认证信息有变化时, 例如用户角色被更新了,就需要重新加载用户信息。
如果你设置了
needs_refresh_callback
函数,当用户的认证信息需要刷新时, 会调用这个函数来重新加载用户信息。
from flask_login import LoginManager, current_user
login_manager = LoginManager()@login_manager.needs_refresh_handlerdefrefresh_user():
current_user.load_data()
login_required 装饰器
该装饰器用来保护视图函数,确保只有登录用户才能访问。如果一个用户没有登录,将会重定向到登录页面。
使用方法很简单,只需要在需要保护的视图函数的前面加上 @login_required 即可。例如:
from flask_login import login_required
@app.route('/school')@login_requireddefsettings():return render_template('school.html')
默认情况下, 重定向地址是
login
, 如果你有其他路径名称,可以使用
login_url
参数来设置重定向地址。例如:
@app.route('/school')@login_required(login_url='/signin')defsettings():return render_template('school.html')
还可以使用 next 参数来设置登录成功后的重定向地址。例如:
@app.route('/login', methods=['GET','POST'])deflogin():next= request.args.get('next')if request.method =='POST':# check login
login_user(user)return redirect(nextor url_for('index'))return render_template('login.html',next=next)
这样在登录成功后会重定向回之前的页面。
📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 827 篇原创博客
从订购之日起,案例 5 年内保证更新
- ⭐️ Python 爬虫 120,点击订购 ⭐️
- ⭐️ 爬虫 100 例教程,点击订购 ⭐️
版权归原作者 梦想橡皮擦 所有, 如有侵权,请联系我们删除。