Django 之 auth 模块
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
类:常用
- 模型
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='家庭地址')
- 配置
settings.py
新增的类继承 AbstractUser
,拓展后将会覆盖 auth_user
表,因此需要配置 settings
,使默认认证知道要使用哪种表认证。
# settings.py
# 在最后添加如下代码
AUTH_USER_MODEL = 'app名.新增的类名'
AUTH_USER_MODEL = 'app.UserInfo' # 示例
- 迁徙数据表
python manage.py makemigrations
python manage.py migrate
- 创建用户
拓展 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
。 - 若还没有迁徙模型,那么正常执行即可。
Django 之 auth 模块的更多相关文章
- 重新整理django中Auth模块
0907自我总结 重新整理django中Auth模块 from django.contrib import auth 一.设置 默认Auth表单 auth默认是使用自带的user表单 自定义Auth表 ...
- 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...
- Django之auth模块(用户认证)
auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...
- Django之auth模块
http://www.cnblogs.com/liwenzhou/p/9030211.html 1.首先导入auth模块 from django.contrib import auth 2.创建aut ...
- Django之Auth模块 实现登录,退出,自带session 与认证功能的一个重要的模块
Auth模板 1. 什么是Auth模块,有什么用? django的auth的模块的使用: auth 是集合注册,登录,注销,session 多个功能集合在一起的模块 2. 使用Auth组件的默认aut ...
- Django权限auth模块详解
转自:http://www.cnblogs.com/Finley/p/5575305.html 1,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证,用户组和权限管理 2,aut ...
- Django之auth模块用户认证模块
一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...
- Django组件(四) Django之Auth模块
Auth模块概述 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能 ...
- django使用auth模块进行身份认证
https://docs.djangoproject.com/zh-hans/2.0/topics/auth/default/#authentication-in-web-requests djang ...
- Django之auth模块(用户认证)登陆组件
auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...
随机推荐
- 次小生成树 POJ 2728
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>us ...
- php设计模式课程---6、策略模式如何使用
php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...
- php版微信公众平台开发之验证步骤实例详解
本文实例讲述了php版微信公众平台开发之验证步骤.分享给大家供大家参考,具体如下: 微信公众平台开发我们现在做得比较多了,这里给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看 ...
- jmeter-接口的依赖
接口的依赖 接口2要用到接口1中返回的数据 大致思路:建立接口1和接口2,把接口1中的yangli字段传递给接口中的入参date里 步骤如下: 1.接口1 2\新建一个HTTP请求,命名为老黄历接口2 ...
- 6 Python 数据类型—字符串
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. var1 = 'Hello World!' var2 = ...
- php常用函数htmlspecialchars、strip_tags、addslashes解析
本文章向大家介绍php开发中经常使用到的字符串函数htmlspecialchars.strip_tags.addslashes的使用方法及他们之间的区别,需要的朋友可以参考一下. 1.函数strip_ ...
- QFileInfo与QFileIconProvider(分别用于获取文件信息和获取文件的图标)
判断文件是否存在,获取文件名称,绝对路径,修改时间等等信息 fileInfo = Qt.QFileInfo(filename) fileIcon = Qt.QFileIconProvider() ic ...
- bzoj 2732: [HNOI2012]射箭 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2732 题解: 这道题的做法我不想说什么了... 其他题解都有说做法... 即使是我上午做 ...
- Python Class 的实例方法/类方法/静态方法
实例方法.类方法.静态方法 class MyClass(object): class_name = "MyClass" # 类属性, 三种方法都能调用 def __init__(s ...
- 解决Mac 系统升级到 10.14.1后 IDA 在非英文输入法时启动crash的问题
Mac 系统升级到10.14.1后,打开IDA时出现以下问题: 解决问题的方法也很简单: 1. 每次打开IDA前先切换到英文输入法模式(每次都要切换,有点麻烦)2. 直接去github上下载 libq ...