Django 内置一个 auth 模块,帮助用户实现注册、登录、注销以及修改密码等功能,帮助开发者省去了很多功夫。

auth 模块

在创建模型时,Django内部会生成一个名为 auth_user 的数据表,用于存储认证的用户信息。

auth 模块提供了一系列的方法,使用之前需要导入:

from django.contrib import auth

authenticate() 方法

提供用户认证功能,验证用户名和密码是否正确等。如验证成功,则返回一个 User 对象。

from django.contrib import auth

def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password') # 用户认证,验证用户名、密码是否正确,并返回一个 user 对象
# username、password 字段对应 auth_user 表中相应字段
user_obj = auth.authenticate(username=username, password=password)

login() 方法

实现用户登录功能,会在后台为登录用户生成 session 数据。

from django.contrib import auth
auth.login(request, user_obj) from django.contrib.auth import login
login(request, user_obj)

接收两个参数,第一个为 HTTPRequest 对象,以及一个认证过的用户对象(即 authenticate() 认证过的用户对象)。

from django.contrib import auth

def login(request):
"""登录"""
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password') # 用户认证,验证用户名、密码是否正确,并返回一个 user 对象
user_obj = auth.authenticate(username=username, password=password)
if user_obj:
# 将验证成功的用户封装到 request.user 对象中
auth.login(request, user_obj)
return redirect('home')
else:
return '错误信息'
return render(request, 'login.html')

认证成功的用户对象,执行 login() 方法,实现登录功能,否则返回错误信息。

Tips

执行过 login() 方法的用户对象,就能通过request.user 拿到当前登录的用户对象,从而取出用户的相关信息,否则取得的将是一个匿名用户对象 AnonymounsUser Object

login(request, user_obj)
# 获得当前登录用户对象
user = request.user
# 获得当前登录用户对象的用户名
username = request.user.username

logout() 方法

该方法实现注销功能,清除当前登录用户数据库中的 session 数据,接收一个 HttpRequest 对象,无返回值。

from django.contrib import auth

def logout(request):
"""注销"""
auth.logout(request)
# 注销后重定向到登录页面
return redirect('login')

is_authenticated 属性

判断当前用户是否通过认证,为布尔值。

def home(request):
"""首页"""
ret = request.user.is_authenticated
print(ret) # True

login_required() 方法

auth 模板提供的一个装饰器工具,能够便捷地为某个视图添加登录校验。

  • 若用户没有登录,则默认会跳转到 accounts/login/,并传递当前访问 url 绝对路径。
  • 自定义跳转路径,只需在 settings.py 中添加:
# 当用户没有登录,访问某个视图时将会跳转到登录页面
LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required

# 添加装饰器
@login_required
def home(request):
"""首页""" return render(request, 'home.html')

当用户访问 home 页面时,若没有登录则会跳转到登录页面,否则返回 home 页面。

用户相关

上面介绍的都是关于登录相关的,下面将介绍如何创建在 auth_user 中创建用户,修改密码,验证密码等。

create_superuser() 方法

该方法用于创建一个超级用户,接收 username、password 两个必要参数。效果与执行 python manage.py createsuperuser 等同。

from django.contrib.auth.models import User

user_obj = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

create_user() 方法

一般情况 create_superuser() 方法很少使用,最常使用的是create_user() 方法,它将会创建一个普通用户,常应用于注册视图中。

创建用户所需字段,应与 auth_user 数据表中字段对应。

from django.contrib.auth.models import User

def signup(request):
# 创建新用户
user_obj = User.objects.create_user(username='lila', password='1234') return HttpResponse('创建成功')

Tips

新创建的用户,保存在 auth_user数据表中的密码是经过加密的。

check_password() 方法

检查登录用户密码是否正确,需要当前请求用户的密码。

from django.contrib.auth.models import User

def signup(request):
# 创建新用户
user_obj = User.objects.create_user(username='lila', password='1234') ret = user_obj.check_password('123456')
print(ret) # False
return HttpResponse('创建成功')

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

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

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

set_password() 方法

该方法用于修改密码,接收要新密码作为参数,最后一定要执行 save() 方法保存,否则无效。

def set_password(request):
"""
修改密码,request.user 中封装了已认证且执行了登录功能的用户对象
:param request:
:return:
"""
request.user.set_password('12')
password = request.user.password
request.user.save()
print(password) return HttpResponse('修改成功')

修改密码示例

该示例仅适用于已登录的用户,在内部修改密码,未登录的用户将跳转到登录页面。

from django.shortcuts import render, redirect, HttpResponse
from django.contrib.auth.decorators import login_required @login_required
def set_password(request):
"""
修改密码,request.user 中封装了已认证且执行了登录功能的用户对象
:param request:
:return:
"""
user = request.user
ret = {'message': None}
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:
ret['message'] = '新密码不能为空' elif new_password != repeat_password:
ret['message'] = '两次密码输入不一致'
else:
user.set_password(new_password)
user.save()
return redirect('login')
else:
ret['message'] = '原密码不正确'
return render(request, 'set_password.html', ret)

auth 模块拓展

由于 auth 模板中 auth_user 数据表字段是固定的,因此当我们使用 auth 模块,想要添加额外的字段时,就需要对其进行拓展。

拓展方法有两种:

  • 模型中新增一个表,与 auth_user 表一对一关联
  • 继承内置的 AbstractUser 类:常用
  1. 模型 models.py 中新建一个类,继承自 AbstractUser
from django.contrib.auth.models import User, AbstractUser   # 导入 AbstractUser 类

class UserInfo(AbstractUser):
"""
继承 AbstractUser
新增字段:phone、addr
"""
phone = models.CharField(max_length=11, verbose_name='手机号码')
addr = models.CharField(max_length=128, verbose_name='家庭地址')
  1. 配置 settings.py

新增的类继承 AbstractUser ,拓展后将会覆盖 auth_user 表,因此需要配置 settings,使默认认证知道要使用哪种表认证。

# settings.py
# 在最后添加如下代码
AUTH_USER_MODEL = 'app名.新增的类名' AUTH_USER_MODEL = 'app.UserInfo' # 示例
  1. 迁徙数据表
python manage.py makemigrations
python manage.py migrate
  1. 创建用户

拓展 auth 模块后,使用的不再是原来 auth_user 表,而是新表 app.UserInfo 表,因此在创建用户时应该注意。

# 拓展之前
from django.contrib.auth.models import User
user_obj = User.objects.create_user(username='lila', password='1234') # 拓展之后
from app.models import UserInfo
user_obj = UserInfo.objects.create_user(username='lila', password='1234')

Tips

  • 若已经迁徙了模型,拓展 auth 模块时,需要将 migrations 文件夹下文件(如:0001_initial.py文件删除),否则会报 ValueError: Related model u'app.model' cannot be resolved
  • 若还没有迁徙模型,那么正常执行即可。

最新文章

  1. JQ-动画合集(ing...)
  2. 利用DNS Zone Transfers漏洞工具dnswalk
  3. Tomcat使用,部署
  4. iOS WKWebView详解
  5. Quartz之主方法运行
  6. 2017年iOS应用将强制使用HTTPS安全加密-b
  7. Hexo学习笔记--常用命令及部署步骤
  8. BCB/Delphi中常用的VCL函数说明(字符串函数)
  9. opencv2对于读书笔记——二值化——thresholded功能
  10. apache泛域名解析
  11. 解决angularjs 在ie8上面 ng-repeat的select控件兼容性问题
  12. scrapy-redis使用以及剖析
  13. 网络协议 22 - RPC 协议(下)- 二进制类 RPC 协议
  14. JS自学笔记01
  15. python中lambda表达式中自由变量的坑,因为for循环结束了 变量还保存着,详见关于for循环的随笔
  16. flask源码剖析
  17. Spring全局异常处理的三种方式
  18. HIVE简单操作
  19. python 之 模块
  20. linux 查看信息-服务器相关

热门文章

  1. adobe flash player 下载地址
  2. 源码分享-纯CSS3实现齿轮加载动画
  3. Delphi - 数组和结构体
  4. Vue2.0 Transition常见用法全解惑
  5. Jmete基础使用
  6. MFC工程名称与所包含文件名称的关系(工程名可以更改,输出的.dll.exe.lib都以最后工程名命名为准)
  7. 【遍历二叉树】01二叉树的前序遍历【Binary Tree Preorder Traversal】
  8. mongodb 学习资料
  9. vs code 安装Scala
  10. 添加一个用户并且让用户获得root权限