Django自带的用户认证

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括
1.用户注册
2.用户登录
3.用户认证
4.注销
5.修改密码

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

auth模块

from django.contrib import auth

auth中提供了许多实用方法:

authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

用法:

user = authenticate(username='theuser',password='thepassword')

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据

用法:

from django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']user_obj = authenticate(username=username, password=password)if user_obj:login(request, user_obj)# Redirect to a success page....else:# Return an 'invalid login' error message....

注意:
只要使用login(request, user_obj)之后,request.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。
详细原理请查看 AuthenticationMiddleware 中间件源码。

logout(request)

该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
用法:

from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.

is_authenticated()

用来判断当前请求是否通过了认证。
用法:

def my_view(request):if not request.user.is_authenticated():return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_requierd()

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
用法:

from django.contrib.auth.decorators import login_required@login_required
def my_view(request):...

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
示例:

LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
用法:

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

create_superuser()

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。
用法:

from django.contrib.auth.models import User
user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

check_password(raw_password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
用法:

ok = user_obj.check_password('密码')

或者直接针对当前请求的user对象校验原密码是否正确:

ok = request.user.check_password(raw_password='原密码')

set_password(raw_password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法!!!
用法:

user_obj.set_password('新密码')
user_obj.save()

一个修改密码功能的简单示例

@login_required
def set_password(request):user = request.usererr_msg = ''if request.method == 'POST':old_password = request.POST.get('old_password', '')new_password = request.POST.get('new_password', '')repeat_password = request.POST.get('repeat_password', '')# 检查旧密码是否正确if user.check_password(old_password):if not new_password:err_msg = '新密码不能为空'elif new_password != repeat_password:err_msg = '两次密码不一致'else:user.set_password(new_password)user.save()return redirect("/login/")else:err_msg = '原密码输入错误'content = {'err_msg': err_msg,}return render(request, 'set_password.html', content)

用户对象的属性

user_obj能够拿到认证所用用户表的数据属性,比如username, password等。
其他常用属性含义如下:
is_staff : 用户是否拥有网站的管理权限.
is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

扩展默认的auth_user表

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!
比如,我想要加一个存储用户手机号的字段,怎么办?
聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?
答案是当然有了。
我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。
这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):"""用户信息表"""nid = models.AutoField(primary_key=True)phone = models.CharField(max_length=11, null=True, unique=True)def __str__(self):return self.username

注意:
按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app名.UserInfo"

自定义认证系统默认使用的数据表之后,我们就可以像使用默认的auth_user表那样使用我们的UserInfo表了。比如:
创建普通用户:

UserInfo.objects.create_user(username='用户名', password='密码')

创建超级用户:

UserInfo.objects.create_superuser(username='用户名', password='密码')

再次注意:
一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

转载于:https://www.cnblogs.com/Paul-watermelon/p/11240265.html

Django-内置用户系统相关推荐

  1. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

  2. 【Lin-CMS内容管理系统框架 v0.3.6】内置用户管理/权限管理/日志系统等常见功能

    [Lin-CMS内容管理系统框架 v0.3.6]内置用户管理/权限管理/日志系统等常见功能 Lin-CMS 是林间有风团队经过大量项目实践所提炼出的一套内容管理系统框架. Lin-CMS 可以有效的帮 ...

  3. Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP:django.contrib.authdjango.contrib.contenttypes ...

  4. django 内置 admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件使用方式有依赖APPdjango.contrib.authdjango.contrib.contenttypesdjan ...

  5. 〖Python〗-- Django内置Admin

    [Django内置Admin] Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP:django.contrib.authdjango.cont ...

  6. 华为鸿蒙内置,内置鸿蒙系统,华为生态产品海雀智能摄像头Pro体验

    提起华为鸿蒙系统,估计很多人都不陌生,作为一款分布式操作系统,目前已经在华为智慧屏.华为手表.九阳.美的等产品中内置了鸿蒙系统,手机鸿蒙系统目前正在内测,估计很快大多数华为荣耀手机都可以升级鸿蒙系统了 ...

  7. Django - 内置admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:复制代码依 ...

  8. 鸿蒙系统摄像头,内置鸿蒙系统,华为生态产品海雀智能摄像头Pro体验

    提起华为鸿蒙系统,估计很多人都不陌生,作为一款分布式操作系统,目前已经在华为智慧屏.华为手表.九阳.美的等产品中内置了鸿蒙系统,手机鸿蒙系统目前正在内测,估计很快大多数华为荣耀手机都可以升级鸿蒙系统了 ...

  9. 华为手机鸿蒙系统自带吗,内置鸿蒙系统的四款华为手机,实力都很强,可惜都有一点瑕疵!...

    随着鸿蒙系统的正式公布,华为手机的热度也升高了不少,尽管华为机型的供货速度以及供货量都不算特别出色,但对于想购买的用户来说,经过一轮又一轮的抢购之后,还是有很大的几率可以买到.而且,华为除了如今已经发 ...

  10. 限制同一IP访问次数,csrf,分页,Paginator,内建用户系统,文件上传,上传到本地

    中间件的使用 限制同一IP访问次数 1.获取远程客户端的IP地址 request.META['REMOTE_ADDR'] 2.得到客户端访问的请求路由信息 request.path_info 创建一个 ...

最新文章

  1. flask与简单的form表单
  2. “误用姓名”,前哈佛教授炮轰中国学者“碰瓷”:“整件事都让人讨厌!
  3. 这道 Go 题目外网超过 80% 的人都答错了,你来试试...
  4. ftpclient怎么获取到该目录下面得文件_你应该知道的10种Python文件系统方法
  5. c++ 应用socket实现C/S端文件的传输
  6. linux界面唤醒,Linux计算机实现自动唤醒和关闭的方法步骤详解
  7. 深入理解Auto Layout 第一弹
  8. 少数人知道的公式+思路,财务报表自动生成,财务总监用了5年
  9. python对浮点类型的数据进行格式化_(自用)Python Log2 数据类型、字符编码、格式化...
  10. 无人驾驶之硬件平台详解
  11. 南无阿弥陀佛是什么意思呢
  12. python五子棋双人对弈_用python实现双人五子棋(终端版)
  13. 如何禁止Windows自动更新AMD显卡驱动
  14. CSS动画效果(animation属性)解析
  15. 规划并优化能在 Google Play 上取得更大成功的游戏
  16. Arnold Denoise流程
  17. docker中没有vi/vim命令
  18. xadmin自定义页面
  19. 三菱MR-JE-C伺服电机FB功能块(适用Q系列PLC) 流水线项目,16个MR-JE-C电机,为了加快编程速度,特意做的一个FB功能块
  20. 用户登录(使用Spring AOP记录登录日志)

热门文章

  1. BZOJ 2818 Gcd
  2. How to connect oracle databse
  3. Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释
  4. C#定义属性-静态属性
  5. 使用docker在CentOS7上搭建WordPress
  6. 区块链监管的一年,剥离“币”的区块链技术该何去何从?
  7. Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
  8. 新购阿里云服务器ECS创建之后无法ssh连接的问题处理
  9. Nexus3.x.x上传第三方jar
  10. MySQL purge 线程