📅  最后修改于: 2023-12-03 15:26:48.822000             🧑  作者: Mango
在网站应用中,通过检查用户是否登录可以实现多种功能,例如:访问受限页面、展示用户信息等。本文将介绍如何检查用户是否登录烧瓶(Flask)应用程序。
Flask-Login 扩展是一个常用的实现用户登录的工具包,它提供了登录管理相关功能的封装,使用起来非常方便。
pip install Flask-Login
from flask_login import LoginManager
app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
from flask_login import UserMixin
class User(UserMixin):
def __init__(self, id, name, password):
self.id = id
self.name = name
self.password = password
def get_id(self):
return str(self.id)
from flask_login import login_user, logout_user, current_user, login_required
@login_manager.user_loader
def load_user(user_id):
# 根据用户 id 从数据库获取用户对象
return User.get(user_id)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 校验用户名密码
user = User.authenticate(request.form.get('username'), request.form.get('password'))
if not user:
# 校验失败,返回错误消息
return render_template('login.html', error='用户名或密码错误')
else:
login_user(user)
# 跳转到首页
return redirect(url_for('index'))
# GET 请求,返回登录页面
return render_template('login.html')
@app.route('/profile')
@login_required
def profile():
return render_template('profile.html')
另一种实现用户登录状态管理的方式是使用 Flask 内置的 session 功能,结合其它相关模块,比如 Werkzeug 的 secure_cookie_serializer 模块,能够方便地完成用户登录和登出功能的实现。
from flask import session
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.securecookie import SecureCookie
class SessionManager:
# 设置 secret_key,用于加密 session 数据
SESSION_KEY = 'your_secret_key'
def __init__(self):
self.serializer = SecureCookie(secret_key=self.SESSION_KEY)
def start_session(self, user_id):
self.serializer['user_id'] = user_id
def get_current_user(self):
user_id = self.serializer.get('user_id')
if user_id:
# 根据 user_id 返回对应的 User 对象
return User.get(user_id)
return None
def end_session(self):
self.serializer.clear()
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 校验用户名密码
user = User.authenticate(request.form.get('username'), request.form.get('password'))
if not user:
# 校验失败,返回错误消息
return render_template('login.html', error='用户名或密码错误')
else:
# 初始化 session
SessionManager().start_session(user.id)
# 跳转到首页
return redirect(url_for('index'))
# GET 请求,返回登录页面
return render_template('login.html')
@app.route('/profile')
def profile():
# 从 session 中获取当前用户
current_user = SessionManager().get_current_user()
if not current_user:
# 当前用户未登录,跳转到登录页面
return redirect(url_for('login'))
# 当前用户已登录,返回个人中心页面
return render_template('profile.html')
本文介绍了两种检查用户是否登录烧瓶应用程序的方案:使用 Flask-Login 扩展和使用 session 完成登录状态存储。这两种方案都可以实现用户登录校验的功能,选择哪种方案主要取决于具体的应用场景。