对所有视图应用 django 身份验证

时间:2021-03-29 16:23:36

标签: python django django-views

我正在尝试为我的 views.py 文件中的所有视图实现 Django 基本身份验证。虽然我可以在每个视图中添加身份验证代码片段,但将其应用于即将到来的视图并不容易。有没有办法让我的 views.py 中的每个视图都自动检查身份验证?

views.py

def mgmt_home(request):
    ##############################################################
    # This code is repetitive
    ##############################################################
    if request.user.is_anonymous:
        return redirect("/login")
    ##############################################################

    test_name = Test.objects.all()[0].test_name

    metadata = {
        "test_name": test_name,
    }
    return render(request, "mgmt_home.html", metadata)

有什么办法可以避免在我的所有视图中使用此 repetitive 代码?

2 个答案:

答案 0 :(得分:1)

您可以使用 django 身份验证中的“login_required()”装饰器或“LoginRequiredMixin”类。 https://docs.djangoproject.com/en/3.1/topics/auth/default/

How to specify the login_required redirect url in django?

答案 1 :(得分:0)

您有两个选择:

  1. 从 django.contrib.auth.decorators 导入 login_required

您可以将这个 @login_required() 装饰器添加到您的每个视图中,它会在您的用户未登录时自动将用户重定向到登录页面(或您希望将用户发送到的任何页面)。

  1. 对于您的情况,我不建议使用此选项,因为这可能是一种矫枉过正,并且对于您的简单问题并不需要。解决方案是创建一个自定义的中间件并将您的代码添加到其中,然后,当然,将中间件添加到 Settings.py 文件中。这样,每次您的视图运行时,您的中间件都会在此之前运行。事实上,这就是中间件的目的。它们旨在减少与您类似的冗余和问题。