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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:44:52