Django用户认证系统核心API与类视图装饰器详解

Luna
Luna
发布时间:2026-10-13 | 2人浏览过
原创

本文详解Django内置用户认证系统的核心API,涵盖create_user创建用户、authenticate验证凭证、login维持会话及logout退出登录。重点解析基于类视图时login_required装饰器的三种实现方案,包括直接装饰as_view、自定义LoginRequiredView继承及LoginRequiredMixin多继承模式,确保类视图安全访问。

一. 认证系统概要

create_user 创建用户

authenticate 验证登录

login 记住用户的登录状态

logout 退出登录

is_authenticated 判断用户是否登录

login_required 判断用户是否登录的装饰器

二. 创建用户和验证登录

在用户注册环节,调用 create_user(username, password, email) 函数。默认配置下,该函数会将 is_active 设为 True,is_staff 设为 False,is_superuser 设为 False。

系统底层会对输入的 password 执行哈希算法加密,随后将加密后的结果存储至数据库。

用户登录时,通过 authenticate(username=username, password=password) 进行身份验证。该函数会检查数据库中是否存在匹配的用户名和密码,若匹配则返回对应的 user 对象。

验证过程中,底层逻辑是对输入的 password 进行哈希加密,然后将生成的哈希值与数据库中存储的密码哈希值进行比对。

三. 记住用户的登录状态

用户成功登录后,调用 login(request, user) 以维持其登录状态。默认情况下,系统会将用户的 id 存储于 session 中。

login 函数接收两个参数:request 和 user。其中 user 对象必须源自 authenticate 的返回值,这意味着在调用 login 之前必须先执行 authenticate。

四. 退出登录

用户注销时,调用 logout(request) 函数。该函数仅需 request 一个参数。

五. 判断用户是否登录

在后端视图函数中,可通过 request.user.is_authenticated() 方法判断当前用户是否已登录。

在前端模板页面中,可使用 {% if user.is_authenticated %}{% endif %} 语法结构来判断用户登录状态。

六. 装饰器判断用户是否登录

对于普通视图函数,可直接使用 @login_required 装饰器。然而,对于基于类的视图(Class-Based Views),其 get 和 post 方法不能直接应用 @login_required 装饰器。

针对基于类视图的登录验证,存在以下三种实现方式:

第一种方案:在 urls 文件中导入 login_required,直接装饰 as_view() 函数的调用结果。

url(r'^$', login_required(UserInfoView.as_view()), name='user') 

第二种方案:自定义一个 LoginRequiredView 类并继承 View 类。在该类中重写 as_view() 方法,并对 as_view() 的返回值应用 login_required 装饰器。自定义视图类无需再直接继承 View,而是直接继承 LoginRequiredView 即可。

class LoginRequiredView(View):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredView, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

第三种方案:自定义一个 LoginRequiredMixin 类,重写 as_view() 方法。该方法内部调用 View 的 as_view(),并对返回值应用 login_required 装饰器。自定义视图类需先继承 LoginRequiredMixin,再继承 View。此方法的关键在于:多继承中 super() 的调用顺序与 __mro__ 的顺序保持一致。

class LoginRequiredMixin(object):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

以上这篇基于Django用户认证系统详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表