基于Django用户认证系统详解

作者:Blog的猿序程个一 时间:2023-04-13 15:35:13 

一. 认证系统概要

create_user 创建用户

authenticate 验证登录

login 记住用户的登录状态

logout 退出登录

is_authenticated 判断用户是否登录

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

二. 创建用户和验证登录

当用户注册的时候用create_user(username,password,email)默认情况下is_active=True,is_staff=False,is_superuser=False。

底层将password用hash算法加密之后存储到数据库中。

当用户登录的时候用authenticate(username=username,password=password)验证登录,判断数据库中是否存在用户输入的账号和密码,返回一个user对象。

底层将password用hash算法加密后和数据库中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来装饰,但是基于类视图的get和post方法不能直接使用@login_required来装饰。

基于类视图的装饰有以下三种:

第一种:在urls文件中导入login_requtred,直接装饰as_view()函数


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

第二种:自定义一个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的返回值。 我们自定义的视图类就不需要再继承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()函数,并装饰as_view()函数的返回值。 我们自定义的视图类需要先继承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)

来源:https://www.cnblogs.com/RomanticLife/archive/2018/02/21/8456940.html

标签:django,用户认证
0
投稿

猜你喜欢

  • JS添加删除一组文本框并对输入信息加以验证判断其正确性

    2024-05-03 15:30:54
  • python进阶教程之函数对象(函数也是对象)

    2022-08-28 01:06:42
  • 在Heroku云平台上部署Python的Django框架的教程

    2022-02-28 08:46:49
  • 浅谈ASP自动采集程序及入库

    2007-08-17 11:25:00
  • python 统计list中各个元素出现的次数的几种方法

    2022-12-09 10:04:01
  • MySQL Order By用法

    2011-01-04 19:50:00
  • Python 机器学习库 NumPy入门教程

    2022-09-28 23:10:41
  • linux实现定时备份mysql数据库的简单方法

    2024-01-16 07:21:57
  • python数据类型_元组、字典常用操作方法(介绍)

    2021-06-22 14:06:05
  • 基于Python matplotlib库绘制箱线图

    2021-09-04 22:23:24
  • python实现每天自动签到领积分的示例代码

    2023-06-18 09:17:32
  • Python迭代器和生成器定义与用法示例

    2022-02-15 19:42:13
  • Python打包成exe文件的详细操作指南

    2023-01-18 06:35:33
  • Mootools 1.2教程(18)——Class 类(第一部分)

    2008-12-19 12:45:00
  • 在Python中操作列表之list.extend()方法的使用

    2023-07-02 20:43:16
  • 给大家整理了19个pythonic的编程习惯(小结)

    2024-01-02 08:00:05
  • 登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法

    2024-01-23 00:13:38
  • SQL Server 2005数据库批量更新解决办法

    2009-04-11 16:12:00
  • Python timeit模块的使用实践

    2023-09-15 00:36:55
  • PHP/ThinkPHP实现批量打包下载文件的方法示例

    2024-05-11 09:49:00
  • asp之家 网络编程 m.aspxhome.com