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

如何在Django+Pyrebase环境中判断Firebase认证用户状态

解决Django+Pyrebase认证后模板无法判断登录状态的问题

核心原因是你没有集成Django自带的用户认证系统,而是用Firebase独立完成认证,request.user是Django默认的匿名用户,所以那些基于is_authenticated的判断都会返回false。以下是具体解决方案:

1. 完善Session存储与视图逻辑

修改views.py,在登录成功后将用户邮箱和Firebase的idToken存入Session,并在视图中传递登录状态:

from django.shortcuts import render, redirect
from datetime import datetime
# 确保已导入Pyrebase配置后的authe对象

def login(request):
    # 检查Session中是否存在Firebase登录标识
    is_logged_in = 'uid' in request.session
    user_email = request.session.get('email', '')
    return render(
        request,
        'app/login.html',
        {
            'title': 'Login',
            'message': 'Login to your account',
            'year': datetime.now().year,
            'is_logged_in': is_logged_in,
            'user_email': user_email
        }
    )

def postlogin(request):
    email = request.POST.get('username')
    password = request.POST.get('password')
    try:
        user = authe.sign_in_with_email_and_password(email, password)
    except:
        message = "Invalid credentials."
        print("invalid")
        return render(request, "app/login.html", {'message': message})
    
    # 将Firebase的idToken和用户邮箱存入Session
    request.session['uid'] = user['idToken']
    request.session['email'] = email
    return render(request, "app/home.html", {"email": email, "is_logged_in": True})

def logout(request):
    # 清除Session中的登录标识
    if 'uid' in request.session:
        del request.session['uid']
        del request.session['email']
    return redirect('login')

2. 修改模板判断逻辑

将login.html中的判断语句替换为基于自定义变量的判断,不再依赖Django自带的用户对象:

{% if is_logged_in %} 
<form id="logoutForm" action="/logout/" method="post" class="navbar-right">
    {% csrf_token %}
    <ul class="nav navbar-nav navbar-right">
        <li><span class="navbar-brand">Hello {{ user_email }}!</span></li>
        <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
    </ul>
</form>

{% else %}

<ul class="nav navbar-nav navbar-right">
    <li><a href="{% url 'login' %}">Log in</a></li>
</ul>

{% endif %}

3. 可选:添加全局上下文处理器(推荐)

如果多个模板都需要判断登录状态,可以创建上下文处理器,让所有模板自动获取登录状态变量,无需在每个视图中手动传递:

  1. 在你的app目录下创建context_processors.py文件:
def firebase_auth_context(request):
    is_logged_in = 'uid' in request.session
    user_email = request.session.get('email', '')
    return {
        'is_logged_in': is_logged_in,
        'user_email': user_email
    }
  1. 在项目的settings.py中找到TEMPLATES配置,将上下文处理器添加到context_processors列表:
TEMPLATES = [
    {
        # 其他配置项...
        'OPTIONS': {
            'context_processors': [
                # 已有的上下文处理器...
                'app.context_processors.firebase_auth_context',
            ],
        },
    },
]

这样所有模板都可以直接使用is_logged_in和user_email变量,无需在视图中重复传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:21:15