如何在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. 可选:添加全局上下文处理器(推荐)
如果多个模板都需要判断登录状态,可以创建上下文处理器,让所有模板自动获取登录状态变量,无需在每个视图中手动传递:
- 在你的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 }
- 在项目的
settings.py中找到TEMPLATES配置,将上下文处理器添加到context_processors列表:
TEMPLATES = [ { # 其他配置项... 'OPTIONS': { 'context_processors': [ # 已有的上下文处理器... 'app.context_processors.firebase_auth_context', ], }, }, ]
这样所有模板都可以直接使用is_logged_in和user_email变量,无需在视图中重复传递。
内容的提问来源于stack exchange,提问作者thewaterbuffalo
相关产品推荐
相关产品推荐

