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

Flask Google OAuth跨蓝图访问时登录状态丢失问题求助

问题

开发基于Flask的Google OAuth登录应用,登录功能正常,但切换到不同蓝图(比如从users/views.py到generator/views.py)访问页面时,登录状态会重置。想知道需要添加哪些配置来保持用户登录状态。

项目结构:

app
- core
- email
- error pages
- generator
    - views.py
- static
- templates
- users
    - views.py
- main.py

用户在users/views.py完成登录,但访问generator/views.py中的页面时会突然登出。generator/views.py代码如下:

generator/views.py

from flask import render_template, url_for, flash, redirect, request, Blueprint, session, abort
from flask_login import login_required, current_user
from menutime import db
from menutime.generator.engine import meal_selector, populate_shopping_list
from menutime.models import Meal_Details, Selections

generator = Blueprint('generator',__name__)

@generator.route("/selections", methods=["GET", "POST"])
@login_required
def selections():
    if request.method == "POST":
        global category_selected, desired_servings
        category_selected = []
        category_selected.append(int(request.form["fish_meals"]))
        desired_servings = int(request.form["servings"])
        
        return redirect(url_for('generator.menu'))
    
    return render_template('selections.html')

除了@login_required,是否还遗漏了标识用户身份的配置?曾尝试添加以下代码但未生效:

@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)
解决方案
  • 确保LoginManager正确初始化并绑定到主应用
    必须在主应用文件(如main.py)中初始化LoginManager并关联到Flask app,不能仅在蓝图中定义user_loader。示例代码:

    from flask import Flask
    from flask_login import LoginManager
    from menutime.models import User
    
    app = Flask(__name__)
    # 配置SECRET_KEY,这是session跨蓝图共享的核心
    app.config['SECRET_KEY'] = '你的随机安全密钥'
    
    login_manager = LoginManager()
    login_manager.init_app(app)
    # 指定未登录时跳转的登录页面路由(对应users蓝图的登录视图)
    login_manager.login_view = 'users.login'
    
    @login_manager.user_loader
    def load_user(user_id):
        # 确保用户查询逻辑正确,比如用query.get而非自定义get方法(如果模型未实现get)
        return User.query.get(int(user_id))
    
  • 检查蓝图注册是否正确
    所有蓝图都要在主app中正确注册,避免配置隔离导致session无法共享。main.py中的注册代码示例:

    from menutime.users.views import users
    from menutime.generator.views import generator
    
    app.register_blueprint(users)
    app.register_blueprint(generator)
    
  • 确认OAuth登录后调用login_user()
    在users/views.py的Google OAuth回调路由中,验证用户信息后必须调用login_user()标记用户为已登录,示例:

    from flask_login import login_user
    
    @users.route('/google/callback')
    def google_callback():
        # 处理Google OAuth回调,获取用户邮箱等信息
        user = User.query.filter_by(email=google_returned_email).first()
        if user:
            # 调用login_user,remember参数可选,用于持久化登录状态
            login_user(user, remember=True)
            return redirect(url_for('generator.selections'))
        # 新用户创建等其他逻辑...
    
  • 验证SECRET_KEY配置
    Flask的session依赖SECRET_KEY加密数据,若未配置或多模块使用不同密钥,会导致session跨蓝图失效。确保主app中配置唯一且安全的SECRET_KEY。

  • 替换全局变量为session存储用户数据
    你在generator/views.py中使用的全局变量category_selected和desired_servings是进程级的,多用户场景下会冲突,建议改用session存储:

    if request.method == "POST":
        session['category_selected'] = [int(request.form["fish_meals"])]
        session['desired_servings'] = int(request.form["servings"])
        return redirect(url_for('generator.menu'))
    

内容的提问来源于stack exchange,提问作者Matt Rende

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:07:42