基于 Django1.10 文档的深入学习(33)—— Using the Django authentication system 之login_required和LogiRequiredMixin

Using the Django authentication system使用Django认证系统

本文档介绍了Django身份验证系统的默认配置。 这种配置已经演变为满足最常见的项目需求,处理相当广泛的任务,并且仔细地实现了密码和权限。 对于认证需求与默认值不同的项目,Django支持大量扩展和定制认证。

Django认证一起提供认证和授权,通常被称为认证系统,因为这些功能有些耦合。


The login_required decorator login_required装饰器

login_required(redirect_field_name='next', login_url=None)[source]

作为一个捷径,你可以使用方便的login_required()装饰器:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

login_required()执行以下操作:

  • 如果用户没有登录,重定向到settings.LOGIN_URL,传递查询字符串中的当前绝对路径。 示例:/ accounts /login /?next = / polls / 3 /
  • 如果用户登录,则正常执行该视图。 视图代码可以自由地假定用户登录。

默认情况下,成功认证时用户应重定向到的路径存储在名为“next”的查询字符串参数中。 如果您希望为此参数使用不同的名称,login_required()将使用一个可选的redirect_field_name参数:

from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')
def my_view(request):
    ...

请注意,如果为redirect_field_name提供值,则很可能需要自定义登录模板,因为存储重定向路径的模板上下文变量将使用redirect_field_name的值作为其键而不是“next”(默认值) )。

login_required()也使用一个可选的login_url参数。 例:

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
    ...

请注意,如果您没有指定login_url参数,则需要确保settings.LOGIN_URL和您的登录视图正确关联。 例如,使用默认值,将以下行添加到URLconf中:

from django.contrib.auth import views as auth_views

url(r'^accounts/login/$', auth_views.login),

settings.LOGIN_URL还接受视图函数名称和命名URL模式。 这允许您自由地重新映射您的URLconf中的登录视图,而无需更新设置。

注意

login_required装饰器不会检查用户的is_active标志,但默认的AUTHENTICATION_BACKENDS会拒绝不活动的用户。


也可以看看

如果您正在为Django的管理员编写自定义视图(或需要相同的权限检查内置视图使用),您可能会发现django.contrib.admin.views.decorators.staff_member_required()装饰器是login_required()的有用替代方法。


The LoginRequired mixin

使用基于类的视图时,可以通过使用LoginRequiredMixin来实现与login_required相同的行为。 这个mixin应该在继承列表的最左边的位置。

class LoginRequiredMixin

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

您可以设置AccessMixin的任何参数来自定义未授权用户的处理:

from django.contrib.auth.mixins import LoginRequiredMixin

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

注意

就像login_required装饰器一样,此mixin不会检查用户的is_active标志,但默认的AUTHENTICATION_BACKENDS拒绝不活动的用户。

你可能感兴趣的:(Django)