如何在Flask所有蓝图中共享单个Pocketbase实例?
解决Flask蓝图共用PocketBase实例的问题
你当前的问题是每个蓝图都单独创建PocketBase客户端实例,导致切换页面时需要重新登录。以下是实现所有蓝图共用同一个实例并避免重复登录的方案:
步骤1:在主文件中创建全局PocketBase实例
修改Main.py,添加Flask session必需的密钥,并创建全局唯一的PocketBase客户端:
from flask import Flask, session from pocketbase import PocketBase from user.user import user from classroom.classroom import classroom app = Flask(__name__) # 设置session密钥,替换为你的随机字符串 app.secret_key = "your-random-secret-key" # 创建全局PocketBase实例,所有蓝图共用 client = PocketBase('https://####-#####.pockethost.io') app.register_blueprint(user, url_prefix="/user") app.register_blueprint(classroom, url_prefix="/classroom") if __name__ == "__main__": app.run(debug=True)
步骤2:修改蓝图,导入全局实例并统一处理认证
修改user.py
删除蓝图内的PocketBase实例创建代码,导入全局实例,并通过before_request钩子自动恢复认证状态:
from flask import Blueprint, request, session, redirect from Main import client user = Blueprint("user", __name__, static_folder="", template_folder="templates") # 每个请求前自动恢复认证状态 @user.before_request def restore_auth_state(): if "pb_auth" in session: client.auth_store.load_from_dict(session["pb_auth"]) else: client.auth_store.clear() @user.route("/") def home(): if client.auth_store.is_valid: return f"已登录,欢迎:{client.auth_store.model.username}" return "请先登录" # 示例登录接口,登录后保存认证状态到session @user.route("/login", methods=["POST"]) def login(): username = request.form.get("username") password = request.form.get("password") # 执行登录 client.collection("users").auth_with_password(username, password) # 将认证状态存入session session["pb_auth"] = client.auth_store.to_dict() return redirect("/user/")
修改classroom.py
同样导入全局实例,添加认证恢复钩子:
from flask import Blueprint, session from Main import client classroom = Blueprint("classroom", __name__, static_folder="", template_folder="templates") @classroom.before_request def restore_auth_state(): if "pb_auth" in session: client.auth_store.load_from_dict(session["pb_auth"]) else: client.auth_store.clear() @classroom.route("/") def home(): if client.auth_store.is_valid: return f"教室页面,当前用户:{client.auth_store.model.username}" return "请先登录"
核心说明
- 共用实例:所有蓝图直接导入主文件中的全局PocketBase实例,避免重复创建客户端。
- 认证状态复用:通过
auth_store.to_dict()将认证信息存入session,再用load_from_dict()在请求前恢复,无需每次用密码重新登录。 - 统一逻辑:
before_request钩子让认证恢复逻辑统一执行,无需在每个路由中重复编写判断代码。
内容的提问来源于stack exchange,提问作者mana
相关产品推荐
相关产品推荐

