将所有视图限制为Django中经过身份验证的用户

时间:2018-01-23 17:41:56

标签: python django

我是Django的新手,我正在开发一个以登录页面作为索引和注册页面的项目。其余页面都必须限制为登录用户,如果未经身份验证的用户尝试联系他们,则必须将他/她重定向到登录页面。

我看到@login_required装饰器会将单个视图限制为已登录的用户,但有没有更好的方法来限制所有视图,只有少数可供未经身份验证的用户使用?

2 个答案:

答案 0 :(得分:4)

您可以编写中间件:

from django.contrib.auth.decorators import login_required

def login_exempt(view):
    view.login_exempt = True
    return view


class LoginRequiredMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_view(self, request, view_func, view_args, view_kwargs):
        if getattr(view_func, 'login_exempt', False):
            return

        if request.user.is_authenticated:
            return

        # You probably want to exclude the login/logout views, etc.

        return login_required(view_func)(request, *view_args, **view_kwargs)

您将中间件添加到MIDDLEWARES列表中并装饰您不希望使用login_exempt进行身份验证的视图。

答案 1 :(得分:1)

  

...有没有更好的方法来限制所有视图,只有少数可供未经身份验证的用户使用?

是。现在是时候学习class based views了。定义需要登录的基类,并使任何经过身份验证的端点继承此基类,而不是在每个函数上使用带有装饰的基于函数的视图。

实现中的流行设计模式是使用mixin class

from django.contrib.auth.mixins import LoginRequiredMixin

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

如果视图使用此mixin,则未经过身份验证的用户的所有请求都将重定向到登录页面。