已认证但 user.is_authenticated 仍为假

2 投票
2 回答
2044 浏览
提问于 2025-04-16 10:20

我正在用GAE和Django-nonrel创建一个简单的应用程序(我觉得这个问题并不是特定于GAE或这个非关系型分支,可能是因为我对Python和Django还不太熟悉,基本的Django安装也可能会出现类似的问题)。

我使用django.contrib.auth来处理用户认证。

在settings.py文件中

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware', )

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.request', )

我用manage.py创建了一个超级用户。

在templates的base.html文件中,我有以下内容,这个文件在其他模板中通过{% extends 'base.html' %}来使用。

{% if user.is_authenticated %} 
    Hello {{ user.username }} 
    [<a href="{% url django.contrib.auth.views.logout %}">sign out</a>] 
{% else %} 
    [<a href="{% url django.contrib.auth.views.login %}">sign in</a>] 
{% endif %} 

在urls.py中,我设置了标准的认证内容(比如从django.contrib.auth.forms导入AuthenticationForm等)。

问题是,我可以成功进行认证,用户名和密码的检查是有效的(不能使用错误的用户名/密码),而且我在管理页面上也能认证通过——但在其他页面上却不行——或者说是可以,但用户信息是空的(None)。

我认为"django.contrib.auth.context_processors.auth"是让这一切发生的关键,但这部分已经在settings.py中设置好了,如上所示。

有没有什么建议可以帮助我找到这个问题的根源?

编辑(扩展Daniels的回答,因为在评论中无法进行代码格式化)

在views.py中,我写的是:

def detail(request):
    obj = get_object_or_404(MyModel, pk=some_id)    
    return render_to_response('myapp/index.html', {'MyModel': obj})

应该是

    return render_to_response('myapp/index.html', {'MyModel': obj}, RequestContent(request))

2 个回答

0

请查看 django-postman丢弃RequestContext。在这里,你给TEMPLATE_CONTEXT_PROCESSORS赋值了两个项目,这样就覆盖了默认的项目。

4

你在渲染模板的时候,有没有使用RequestContext?如果没有使用的话,上下文处理器是不会被应用的。

撰写回答