📌  相关文章
📜  检查用户是否登录烧瓶 - Python (1)

📅  最后修改于: 2023-12-03 15:26:48.822000             🧑  作者: Mango

检查用户是否登录烧瓶

在网站应用中,通过检查用户是否登录可以实现多种功能,例如:访问受限页面、展示用户信息等。本文将介绍如何检查用户是否登录烧瓶(Flask)应用程序。

方案一:使用 Flask-Login 扩展

Flask-Login 扩展是一个常用的实现用户登录的工具包,它提供了登录管理相关功能的封装,使用起来非常方便。

  1. 安装 Flask-Login 扩展:
pip install Flask-Login
  1. 在应用程序中导入扩展并初始化:
from flask_login import LoginManager

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
  1. 编写 User 模型:
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)
  1. 编写用户回调函数:
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)
  1. 定义登录路由:
@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')
  1. 在需要校验用户是否登录的路由函数中添加装饰器:
@app.route('/profile')
@login_required
def profile():
    return render_template('profile.html')
方案二:使用 session 完成登录状态的存储

另一种实现用户登录状态管理的方式是使用 Flask 内置的 session 功能,结合其它相关模块,比如 Werkzeug 的 secure_cookie_serializer 模块,能够方便地完成用户登录和登出功能的实现。

  1. 导入 Flask 内置的 session 模块和 secure_cookie_serializer 模块:
from flask import session
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.securecookie import SecureCookie
  1. 定义用于对 session 进行操作的类:
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()
  1. 在登录路由函数中完成 session 的初始化:
@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')
  1. 在需要校验用户是否登录的路由函数中通过 session 判断:
@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 完成登录状态存储。这两种方案都可以实现用户登录校验的功能,选择哪种方案主要取决于具体的应用场景。