Django网站登录状态仅首页有效,其他页面自动登出问题求助
问题解决:Django登录后仅首页显示正确导航,其他页面显示未登录
核心问题
你目前的实现错误地依赖手动在session中存储认证状态(is_authenticated、user_type等),但只有首页视图把这些变量传到了模板上下文,其他视图没有传递,导致模板无法识别用户已登录。此外,Django本身提供了完善的认证机制,不需要手动维护session变量。
分步解决方案
1. 移除手动维护的Session变量,正确使用Django认证系统
修改你的UserLoginView和AgentLoginView,删除所有手动设置session的代码,login()函数已经会自动处理用户会话:
class UserLoginView(LoginView): authentication_backend = "users.backends.UserAuthBackend" template_name = 'users/login.html' form_class = UserSignInForm def form_valid(self, form): user = form.get_user() user.backend = self.authentication_backend login(self.request, user) return redirect('home') class AgentLoginView(LoginView): authentication_backend = "users.backends.AgentAuthBackend" template_name = 'users/agent_login.html' form_class = AgentSignInForm def form_valid(self, form): agent = form.get_user() agent.backend = self.authentication_backend login(self.request, agent) return redirect('home')
2. 修改模板,直接使用request.user
更新base.html,直接通过request.user获取认证状态和用户类型,不需要依赖视图传递的上下文变量:
{% if request.user.is_authenticated %} {% if request.user.is_agent %} <li><a href="{% url 'agent-dashboard' request.user.slug %}">Dashboard</a></li> <li><a href="{% url 'agent-sign-out' %}">Agent Sign Out</a></li> {% else %} <li><a href="{% url 'profile' %}">Profile</a></li> <li><a href="{% url 'logout' %}">Sign Out</a></li> {% endif %} {% else %} <li><a href="{% url 'login' %}">Sign In</a></li> <li><a href="{% url 'agent-sign-in' %}">Agent Sign In</a></li> {% endif %}
3. 简化首页视图,移除Session相关逻辑
修改home视图,直接使用request.user获取用户信息,不需要从session中读取:
def home(request): agents = Agent.objects.all() properties = Property.objects.all() # 直接从request.user获取信息 is_agent = isinstance(request.user, Agent) if request.user.is_authenticated else False user = request.user if is_agent else None context = { 'agents': agents, 'properties': properties, 'is_agent': is_agent, 'user': user } return render(request, 'blog/index.html', context)
4. 移除无用的中间件和信号
你的AgentAuthenticationMiddleware和user_logged_in_callback信号没有实际作用,直接删除这两个文件中的对应代码,同时在settings.py中移除AgentAuthenticationMiddleware的配置。
5. 优化用户模型(重要)
当前你同时继承AbstractUser创建了CustomUser和Agent两个模型,这会导致Django认证系统混乱(Django仅支持一个AUTH_USER_MODEL)。建议重构模型:
- 方式一:使用单一自定义用户模型,添加
user_type字段区分普通用户和Agent - 方式二:让
Agent模型与CustomUser建立OneToOneField关联,而不是继承AbstractUser
验证
完成上述修改后,登录任何用户/Agent,访问任意页面,导航栏都会正确显示对应登录状态的链接。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

