You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:45:15