Python 如何检查用户是否登录

Python 如何检查用户是否登录,python,django,django-views,django-templates,Python,Django,Django Views,Django Templates,我在发票管理系统的工作,用户可以添加发票数据,它将保存在数据库中,每当用户登录的数据将出现在主页上,但每当用户注销并尝试访问主页,但它给出以下错误 TypeError at / 'AnonymousUser' object is not iterable 我尝试了匿名用户的身份验证方法,但仍然不起作用 我希望如果用户已登录,则应打开home.html,否则intro.html 这是我的密码 views.py home.html {% extends "invoicedata/base.htm

我在发票管理系统的工作,用户可以添加发票数据,它将保存在数据库中,每当用户登录的数据将出现在主页上,但每当用户注销并尝试访问主页,但它给出以下错误

TypeError at /

'AnonymousUser' object is not iterable
我尝试了匿名用户的身份验证方法,但仍然不起作用

我希望如果用户已登录,则应打开
home.html
,否则
intro.html

这是我的密码 views.py

home.html

{% extends "invoicedata/base.html" %}
{% block content %}
      {% for invoice in invoices %}
      <article class="media content-section">
        <div class="media-body">
          <div class="article-metadata">
            <small class="text-muted">{{ invoice.date_posted|date:"F d, Y" }}</small>
            <h2><a class="article-title" href="{% url 'invoice-detail' invoice.id %}">{{ invoice.issuer }}</a></h2>
          </div>

          <p class="article-content">{{ invoice.invoice_number }}</p>
          <p class="article-content">{{ invoice.date }}</p>
          <p class="article-content">{{ invoice.amount }}</p>
          <p class="article-content">{{ invoice.currency }}</p>
          <p class="article-content">{{ invoice.other }}</p>
          <div class="article-metadata">
            <small class="text-muted">{{ invoice.author }}</small>
          </div>

        </div>
      </article>
      {% endfor %}
{% endblock content %}
{%extends“invoicedata/base.html”%}
{%block content%}
{发票%中发票的%s}

{{invoice.invoice\u number}

{{invoice.date}

{{invoice.amount}

{{invoice.currency}

{{invoice.other}

{{invoice.author} {%endfor%} {%endblock内容%}
简介.html

{% extends "invoicedata/base.html" %}
{% block content %}
    <h2>login to your portal for great auditing services</h2>
{% endblock content %}
{%extends“invoicedata/base.html”%}
{%block content%}
登录您的门户以获得出色的审计服务
{%endblock内容%}

在HTML上下文中,您可以执行以下操作:

{%if user.u经过身份验证%}
#一些武断的东西
  • {%endif%}
    然后在python上下文中,您可以执行以下操作:

    从django.contrib.auth.decorators导入登录名\u必需
    @需要登录
    函数stuff():
    .....
    
    其中,
    @login\u required
    应为任何只应由登录用户运行的功能加上前缀

    编辑:为了解决您的特定用例,您只需执行以下操作:


    如果request.user.经过身份验证:

    我终于找到了适合我的解决方案

    给你

    Django提供了我在invoicelistview函数中使用的

    from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
    
    class InvoiceListView(LoginRequiredMixin,ListView):
        model = Invoicelist
        template_name = 'invoicedata/home.html'
        context_object_name = 'invoices'
    
        def get_queryset(self):
            return self.model.objects.all().filter(author=self.request.user).order_by('-date_posted')[:2]
    

    就这样。现在,每当用户注销时,它都会重定向到登录页面

    我知道问题已经得到了回答,我只想总结一下向未经身份验证的用户隐藏/显示信息的每种方法

    1。需要登录的装饰程序

    from django.utils.decorators import method_decorator
    
    class ProtectedView(TemplateView):
        template_name = 'secret.html'
    
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super().dispatch(*args, **kwargs)
    
    如果您处理的是功能视图,您可以这样装饰它:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
        pass
    
    {% if user.is_authenticated %}
       <p> Hidden content! </p>
        <!-- You can also access the user data like this -->
       <p> {{ {{ request.user }} }} </p>
    {% endif %}
    
    这将仅向经过身份验证的用户显示视图。如果是匿名的,它们将被重定向到登录url(settings.login\uURL)

    2。所需的登录名mixin

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class MyView(LoginRequiredMixin, View):
        login_url = '/login/'
        redirect_field_name = 'redirect_to'
    
    这适用于基于类的视图。来自Django文档:

    如果视图正在使用此mixin,则未经身份验证的用户的所有请求都将重定向到登录页面或显示HTTP 403禁止错误,具体取决于raise_exception参数

    与前面的方法一样,您可以自定义
    login\u url
    redirect\u字段\u name

    3。基于类的视图方法装饰器

    from django.utils.decorators import method_decorator
    
    class ProtectedView(TemplateView):
        template_name = 'secret.html'
    
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super().dispatch(*args, **kwargs)
    
    4。HTML模板化

    最后,如果您只想为未经身份验证的用户隐藏某些特定的HTML块,您可以将其打包如下:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
        pass
    
    {% if user.is_authenticated %}
       <p> Hidden content! </p>
        <!-- You can also access the user data like this -->
       <p> {{ {{ request.user }} }} </p>
    {% endif %}
    
    {%if user.u经过身份验证%}
    隐藏内容

    {{{{request.user}}}}

    {%endif%}
    在本文中,我们将介绍如何检查用户是否登录到Django

    因此,有几种方法可以做到这一点,但我们将介绍的方法是在Django中使用request对象

    通过调用request.user,我们可以访问当前登录的用户

    然后,我们可以使用
    is_authenticated()
    函数来确定用户当前是否经过身份验证(登录到该帐户)

    因此,我们将创建一个简单的脚本,如果用户登录,我们将打印“登录”,如果用户未登录,我们将打印“未登录”

    基本上,我们都是在views.py文件中完成这一切的,这是我们的主要Python代码经常使用的文件

    代码如下所示

    def index(request):
        if request.user.is_authenticated():
            print("Logged in")
        else:
            print("Not logged in")
    
    
    因此在这段代码中,在views.py文件中,我们有一个名为index的函数,它在参数中传递,。请求

    request.user引用已登录的用户(如果未登录,则引用未登录的用户)。函数
    已通过身份验证()
    ,然后检查用户是否已通过身份验证(登录)

    如果是这样,我们打印“登录”。如果没有,我们打印“未登录”

    当然,除了打印这些语句,你还可以做很多其他的事情

    如果用户登录,我们可以呈现一个模板。如果没有人登录,我们可以呈现另一个模板

    我们可以做的其他事情是,如果用户登录,我们可以呈现一个模板。如果没有,我们可能会引发404页未找到错误

    我们可以做的另一件事是,如果用户登录,我们可以呈现一个模板。如果没有,我们可以将用户重定向到登录页面


    因此,根据用户是否登录,可以做一些事情。

    嘿,logankilpatrick,谢谢你的回复。我尝试了你的解决方案,但仍然不起作用。实际上,如果用户登录了,我想呈现主页,否则从同一个主页函数进入介绍页在索引中,您可以执行:
    如果请求。user.经过身份验证:
    ,如果是真的,将homepage.html呈现在介绍页上。我尝试了,但仍然没有工作,并给出了相同的错误,即/'AnonymousUser'对象的TypeError不可编辑。嘿,Martin,谢谢你的回复,事实上,我想就这个问题悬赏,但我错把它给了这个问题,我知道这是愚蠢的,很抱歉给你带来不便,但如果你对提到的问题给出任何答案,那么我可以把这个给你。我不明白,另一个问题与这个问题无关,没有悬赏:没关系@Mayur Satav你能勾选这个答案吗?