一、auth模块介绍

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

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

二、auth模块常用方法

  1. from django.contrib import auth

## create_superuser()

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

用法:

  1. from django.contrib.auth.models import User
  2. user = User.objects.create_superuserusername='用户名',password='密码',email='邮箱',...)

还可以在菜单栏tool中Run manage.py Task下进行命令行创建超级用户:createsuperuser然后根据提示创建即可

## create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等,该方法和创建超级用户一样,只不过用户权限会有差别

用法:

  1. from django.contrib.auth.models import User
  2. user = User.objects.create_userusername='用户名',password='密码',email='邮箱',...)

tip:Run manage.py Task下无法创建普通用户

## authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

用法:

  1. user = authenticate(username='usernamer',password='password') # 用户名和密码都要传才行

## login(HttpRequest, user)

该函数接受一个HttpResponse对象,以及一个经过认证的User对象

该函数实现一个用户登录的功能,本质上会在后端为该用户生成相关的session数据

用法:

  1. urls.py
  2. url(r'^login/', views.my_login),
  3.  
  4. views.py
  5. from django.contrib.auth import authenticate,login
  6.  
  7. def my_login(request):
  8. if request.method == 'POST':
  9. # 获取前端账号密码
  10. username = request.POST['username']
  11. password = request.POST['password']
  12. # 用户认证
  13. user = authenticate(username=username, password=password)
  14. # 用户认证成功
  15. if user:
  16. # 实现用户登录功能,为该用户创建生成session数据
  17. login(request, user) # 这里只要执行了login(request, user),在后端任何地方都可以通过request.user拿到当前登录的用户对象
  18. return render(request, 'index.html')
  19. # 认证不成功,说明用户名密码错误
  20. else:
  21. return HttpResponse('用户名或密码错误,登录失败')
  22. return render(request, 'login.html')
  23.  
  24. login.html
  25. <!DOCTYPE html>
  26. <html lang="en">
  27. <head>
  28. <meta charset="UTF-8">
  29. <title>登录</title>
  30. </head>
  31. <body>
  32. <form action="" method="post">
  33. {% csrf_token %}
  34. <p>用户名:<input type="text" name="username"></p>
  35. <p>密码:<input type="password" name="password"></p>
  36. <p><input type="submit"></p>
  37. </form>
  38. </body>
  39. </html>
  40. index.html
  41. <!DOCTYPE html>
  42. <html lang="en">
  43. <head>
  44. <meta charset="UTF-8">
  45. <title>主页面</title>
  46. </head>
  47. <body>
  48. <h1>我是登录后才能看到的页面</h1>
  49. </body>
  50. </html>

## logout(request) 

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

用法:

  1. from django.contrib.auth import logout
  2. def my_logout(request):
  3. logout(request)
  4. return redirect('/home/')
  5.  
  6. def my_home(request):
  7. return render(request, 'home.html')

## is_authenticated()

用来判断当前请求是否通过了认证。返回一个布尔值

用法:

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

## login_requierd()

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

用法:

  1. from django.contrib.auth.decorators import login_required
  2.  
  3. @login_required
  4. def my_view(request):
  5. ...

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

示例:

  1. # 局部配置
  2. # @login_required(login_url='/auth_login/')
  3. # 全局配置
  4. # auth自动跳转
  5. LOGIN_URL = '/auth_login/' # settings.py配置

实例:

  1. # 导入用户认证模块和login函数
  2. from django.contrib.auth import authenticate,login
  3.  
  4. def my_login(request):
  5. if request.method == 'POST':
  6. # 获取前端账号密码
  7. username = request.POST['username']
  8. password = request.POST['password']
  9. next_url = request.GET.get('next') # 获取到跳转过来的原页面的url
  10. # 用户认证
  11. user = authenticate(username=username, password=password)
  12. # 用户认证成功
  13. if user:
  14. # 实现用户登录功能,为该用户创建生成session数据
  15. login(request, user)
  16. return redirect(next_url) # 登录成功自动跳转到原来的页面
  17. # 认证不成功,说明用户名密码错误
  18. else:
  19. return HttpResponse('用户名或密码错误,登录失败')
  20. return render(request, 'login.html')
  21.  
  22. from django.contrib.auth.decorators import login_required
  23. # Django登录验证装饰器在跳转到登陆页面时候会自动在页面末尾拼接一个?next=当前url
  24. @login_required
  25. def my_home(request):
  26. return render(request, 'home.html')

## check_password(password)

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

密码正确返回True,否则返回False。

用法:

  1. ok = user.check_password('密码')

## set_password(password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

用法:

  1. user.set_password(password='')
  2. user.save(

修改密码示例:

  1. @login_required
  2. def set_password(request):
  3. user = request.user
  4. err_msg = ''
  5. if request.method == 'POST':
  6. old_password = request.POST.get('old_password', '')
  7. new_password = request.POST.get('new_password', '')
  8. repeat_password = request.POST.get('repeat_password', '')
  9. # 检查旧密码是否正确
  10. if user.check_password(old_password):
  11. if not new_password:
  12. err_msg = '新密码不能为空'
  13. elif new_password != repeat_password:
  14. err_msg = '两次密码不一致'
  15. else:
  16. user.set_password(new_password)
  17. user.save()
  18. return redirect("/login/")
  19. else:
  20. err_msg = '原密码输入错误'
  21. content = {
  22. 'err_msg': err_msg,
  23. }
  24. return render(request, 'set_password.html', content)

修改密码

## User对象的属性

User对象属性:username, password

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

三、扩展默认的auth_user表

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

比如,我想要加一个存储用户手机号的字段,怎么办?

聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?

答案是当然有了。

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

  1. # app01下models.py文件中
  2.  
  3. from django.db import models
  4. from django.contrib.auth.models import User,AbstractUser
  5. # 让拓展的auth_user表:userinfo继承AbstractUser,这样userinfo表拥有了原来auth_user表的所有属性(字段)
  6. class Userinfo(AbstractUser):
  7. phone = models.CharField(max_length=32)
  8. avatar = models.CharField(max_length=32)

需要注意:

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

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

再次注意:

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

示例:

这里需要注意:如果在设置完做数据库迁移命令migrate的时候报错:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'

解决方法是:删除数据库中 除了auth_user的其他表,然后重新来一次

Web框架之Django_10 重要组件(Auth模块)的更多相关文章

  1. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  2. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  3. Web框架之Django_08 重要组件(form组件、cookie和session组件)

    摘要: form组件 cookie组件 session组件 一.form组件 form介绍我们之前在html页面中利用form表单向后端提交数据时候,都需要对用户的输入进行校验,比如校验用户是否输入正 ...

  4. WEB框架Django之Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一 通过form实现校验字段功能 模型:mod ...

  5. web框架的本质

    一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响 ...

  6. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  7. django基础一之web框架的本质

    一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响 ...

  8. day 52 Django基础一之web框架的本质

    Django基础一之web框架的本质   django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于D ...

  9. 01.Django基础一之web框架的本质

    一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响 ...

随机推荐

  1. 蓝牙硬件交互数据传输Demo

    #import "ViewController.h" #import <CoreBluetooth/CoreBluetooth.h> @interface ViewCo ...

  2. Codeforces Round #546 (Div. 2) B. Nastya Is Playing Computer Games

    链接:https://codeforces.com/contest/1136/problem/B 题意: 有n个井盖,每个井盖上有一个小石头. 给出n和k,k表示刚开始在第k个井盖上方. 有三种操作, ...

  3. BZOJ2440(容斥+莫比乌斯函数)

    题目本质: 首先有如下结论: 而通过写一写可以发现: 举例来讲,36及其倍数的数,会被1的倍数加一遍,被4的倍数扣一遍,会被9的倍数扣一遍,而为了最终计数为0,需要再加回来一遍,所以在容斥里面是正号. ...

  4. (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714

    这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...

  5. how browser handler file:/// link

    1. why browser can only open .txt file directly, pop up open or save dialog for others? 2. html cann ...

  6. 调用submit()方式提交表单

    今天在看高级程序设计时看到的这样一段话: 在以调用submit()方法的形式提交表单时,不会触发submit事件 写了一个小例子做了下测试,的确如此: <form id="fm&quo ...

  7. 牛客网Java刷题知识点之什么是cookie、什么是session、cookie和session有什么区别

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21170&query=&asc= ...

  8. Linux 安装reids

    1.下载: wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2.解压: .tar.gz 3.安装: cd /redis- make ...

  9. jQuery1.6.1源码分析系列(作者:nuysoft/高云)

    作者:nuysoft/高云 QQ:47214707 Email:nuysoft@gmail.com jQuery源码分析(版本1.6.1) 00 前言开光 01 总体架构 02 正则表达式-RegEx ...

  10. option标签selected="selected"属性失效的问题

    要在select标签上面加上autocomplete="off"关闭自动完成,不然浏览器每次刷新后将自动选择上一次关闭时的option,这样默认属性selected="s ...