Python Django中的用户身份验证

Python Django中的用户身份验证,python,django,django-templates,authentication,Python,Django,Django Templates,Authentication,几个月前,我学会了如何在Django中验证用户身份,但后来我升级了,遇到了一些问题,所以今天早上我突然想到,我可能从一开始就没有正确地进行验证,所以我决定询问 在我的项目的URL.py文件中,^accounts/login/$和^accounts/logout/$都连接到django.contrib.auth.views的内置登录和注销视图,^accounts/profile/$连接到我编写的一个视图,这里称为start_,其内容基本如下: def start_here(request):

几个月前,我学会了如何在Django中验证用户身份,但后来我升级了,遇到了一些问题,所以今天早上我突然想到,我可能从一开始就没有正确地进行验证,所以我决定询问

在我的项目的URL.py文件中,^accounts/login/$和^accounts/logout/$都连接到django.contrib.auth.views的内置登录和注销视图,^accounts/profile/$连接到我编写的一个视图,这里称为start_,其内容基本如下:

def start_here(request):
    if request.user:
        user_obj = request.user
    else:
        user_obj = None
    is_auth = False
    if request.user.is_authenticated():
        is_auth = True
    return render_to_response("profile.html", {'auth': is_auth,'user': user_obj,})
现在,profile.html扩展了一个名为master.html的主模板,其中有一个navbar块,如果下面的“auth”==True代码段,则其内容应该更改

{% block navbar %}
            {% if auth %}
                <a href="">Link A</a>
                <a href="">Link B</a>
                <a href="">Link C</a>
                <a href="">Link D</a>
                <a href="">Link E</a>
                <a href="">Link F</a>
                <a href="/accounts/logout/">Logout</a>
            {% else %}
                <a href="/accounts/login/">Login</a>
            {% endif %}
{% endblock %}
我的问题是,当我登录时,它重定向到/accounts/profile,导航栏不显示链接A-F+Logout,它只显示login。除非我手动将上面的块复制粘贴到profile.html中,否则它不会按我期望的方式工作。调用render_to_response时,我提供的上下文是否传递给父模板以及子模板

master和profile.html的完整源代码:
我在代码中没有发现任何可疑的内容。

是的,在render\u to\u响应中传递的上下文将传递给命名模板以及它包含或继承的所有模板

你应该考虑使用

还有一件事要检查。。。 只是确保:

您的配置文件模板以

{% extends 'master.html' %}

为了确保django正确识别用户,您需要确保在设置模块中正确启用它。具体来说,您需要确保在settings.MIDDLEWARE\u类中启用了SessionMiddleware和AuthenticationMiddleware模块。另外,请确保您已安装的应用程序中有auth,并且自启用syncdb后您已运行了它


如果您没有采取上述步骤,django将无法检测用户何时登录并正确执行请求设置

这个答案无关紧要,但是Jim关于使用RequestContext的建议非常好,我想明确地解释一下如何使用它

您可以将start_here函数缩减为

from django.template import RequestContext

def start_here(request):
    return render_to_response("profile.html", {},
        context_instance=RequestContext(request))
通过使用RequestContext,用户将自动添加到上下文中。而不是使用

{% if auth %}
使用


能否提供master.html的阻止代码?听起来你遇到的问题是阻塞。另外,要回答您关于上下文的问题:渲染中涉及的所有模板都将看到上下文。等等,你说的阻止代码是什么意思?master.html的全部内容?在profile.html中有{%block navbar%}…内容…{%endblock%}。您需要在扩展的模板中有一个匹配的{%block navbar%}{%endblock%},否则它将不会显示。事实上,将块复制并粘贴到master.html中可以正常工作,这表明您可能在这些块标记中混淆了某些内容。实际上,我是从master.html->profile.html复制粘贴块的,而不是从另一个方向复制粘贴块的。大约3.5个小时后,我试图找出到底是怎么回事,当我重新启动dev服务器时,问题消失了。呵呵。
{% if user.is_authenticated %}