如何检查用户是不是登录

Posted

技术标签:

【中文标题】如何检查用户是不是登录【英文标题】:how to check whether user is logged in or not如何检查用户是否登录 【发布时间】:2020-08-09 22:50:57 【问题描述】:

我正在开发发票管理系统,用户可以在其中添加发票数据并将其保存在数据库中,每当用户登录时,数据就会出现在主页上,但每当用户注销并尝试访问主页时,它都会给出以下信息错误。

TypeError at /

'AnonymousUser' object is not iterable

我尝试了AnonymousUser.is_authenticated 方法,但还是不行。

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

这是我的代码 视图.py


from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import (
    ListView,
    DetailView,
    CreateView,
    UpdateView,
    DeleteView
)
from .models import Invoicelist

def home(request):

    if request.user.is_authenticated():
        context = 
        'invoices': Invoicelist.objects.all()
        
        return render(request, 'invoicedata/home.html', context)

    else:
        return render(request, 'invoicedata/intro.html', context)

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 %

intro.html

% extends "invoicedata/base.html" %
% block content %
    <h2>login to your portal for great auditing services</h2>
% endblock content %

【问题讨论】:

【参考方案1】:

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

在这里

Django 提供了LoginRequiredMixin 我在 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]

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

【讨论】:

【参考方案2】:

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

1.需要登录的装饰器

如果你正在处理一个函数式视图,你可以这样装饰它:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    pass

这只会向经过身份验证的用户显示视图。如果匿名,他们将被重定向到登录 url (settings.LOGIN_URL)

2。 LoginRequiredMixin

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

这适用于基于类的视图。来自 Django 文档:

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

和之前的方法一样,可以自定义login_urlredirect_field_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 块,你可以这样包装它:

% if user.is_authenticated %
   <p> Hidden content! </p>
    <!-- You can also access the user data like this -->
   <p>   request.user   </p>
% endif %

【讨论】:

嘿马丁谢谢你的回复,实际上我想为这个问题提供赏金***.com/q/61265666/8379852 但错误地给了这个问题我知道这很愚蠢,很抱歉给你带来不便,但如果你给出任何答案对于提到的问题,我可以把这个交给你 我不明白,另一个问题与这个无关,也没有赏金:没关系! @Mayur Satav 你能打勾这个答案吗?【参考方案3】:

在 HTML 上下文中,你可以这样做:

% if user.is_authenticated % 
        # some arbitary stuff
        <li class="nav-item">
            <a class="nav-link" href="#"><strong> user.username </strong></a>
        </li>
% endif %

然后在 python 上下文中你可以这样做:

from django.contrib.auth.decorators import login_required

@login_required
function stuff():
.....

其中@login_required 应为仅应由登录用户运行的任何函数添加前缀。

编辑:为了解决您的特定用例,您只想做:

if request.user.is_authenticated:

【讨论】:

嘿 logankilpatrick 感谢您的回复。我尝试了您的解决方案,但仍然无法正常工作。实际上,如果用户登录,我想呈现主页,否则来自相同主页功能的介绍页面 在您的索引中,您可以执行以下操作:if request.user.is_authenticated:,如果是,则呈现 homepage.html,否则呈现介绍页面。 我试过但仍然没有工作给出同样的错误,即 TypeError at / 'AnonymousUser' object is not iterable.【参考方案4】:

在本文中,我们将讨论如何在 Django 中检查用户是否登录。

所以,有几种方法可以做到这一点,但我们将介绍的方法是使用 Django 中的请求对象。

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

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

所以,我们将创建一个简单的脚本,如果用户登录,我们将打印“Logged in”,如果用户未登录,我们将打印“Not logged in”

基本上,我们在 views.py 文件中完成所有这些操作,该文件是我们的主要 Python 代码始终所在的文件。

代码如下所示。

def index(request):
    if request.user.is_authenticated():
        print("Logged in")
    else:
        print("Not logged in")

所以在这段代码中,在我们的views.py 文件中,我们有一个名为index 的函数,它是在参数中传递的。请求。

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

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

当然,除了打印这些语句之外,您还可以做很多其他事情。

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

其他事情,我们可以做的是如果用户登录,我们可以渲染一个模板。如果没有,我们可能会引发 404 Page Not Found 错误。

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

因此,根据用户是否登录,可以做几件事。

【讨论】:

以上是关于如何检查用户是不是登录的主要内容,如果未能解决你的问题,请参考以下文章

如何在目标c中检查用户是不是登录?

AWS Amplify,如何检查用户是不是登录?

Symfony 2:如何检查用户是不是未在模板中登录?

如何检查未登录用户是不是有角色?

如何检查用户是不是在 php 中登录?

如何检查用户是不是在 php 中登录?