Django 2.0 学习(17):Django 用户认证(auth模块)
Django 用户认证(auth模块)
一、认证登陆
在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就需要自己编写大量的代码。实际上,Django已经提供了内置的用户认证功能。在使用"python manage.py makemigrations"和"python manage.py migrate"迁移完成数据库之后,根据配置文件"settings.py"中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是:

其中,进行用户认证的数据表为auth_user,要使用Django自带的认证功能,首先需要导入auth模块。
二、auth模块
from django.contrib import auth
1.authenticate():验证用户输入的用户名和密码是否正确
提供了用户认证,即验证用户名和密码是否正确,一般需要username password两个关键字参数。如果认证信息有效,返回User对象。authenticate()会在User对象上设置一个属性标识哪种认证后端认证了该用户,且该信息在后面的登陆过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会产生错误。
user = authenticate(username="someone", password="somepassword")
2.login(HttpRequest, user):用户登陆
该函数接受一个HttpRequest对象,以及一个认证的User对象,此函数使用Django的session框架给某个已认证的用户附加上session id等信息。
from django.contrib.auth import authenticate, login
def my_view(request):
	username = request.POST["username"]
	password = request.POST["password"]
	user = authenticate(username=username, password=password)
	if user:
		login(request, user)
		# Redirect to a success page.
		...
	else:
		# Return an "invalid login" error message.
		...
3.logout(request):注销用户
该函数接受一个HttpRequest对象,无返回值,当调用该函数时,当前请求的session信息会全部清除,该用户即使没有登陆,使用该函数也不会报错。
from django.contrib.auth import logout
def my_logout(request):
	logout(request)
	# Redirect to a success page.
4.User对象的is_authenticated()
- 1.用户登陆后才能访问某些页面;
- 2.如果用户没有登陆就访问该页面,直接跳转到登陆页面;
- 3.用户在跳转的登陆页面中完成登陆后,自动访问跳转到之前访问的地址页面;
方法1:
def custom_view(request):
	if not request.user.is_authenticated():
		return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))
方法2:Django已经为我们设计好了一个用于此种情况的装饰器:login_required()
from django.contrib.auth.decorators import login_required
@login_required
def custom_view(request):
	...
若用户没有登陆,则会跳转到Django默认的登陆URL"/accounts/login/"(这个值可以在settings文件中通过LOGIN_URL进行修改),并传递当前访问url的绝对路径(登陆成功后,会重定向到该路径)。
三、User对象
- user对象属性:username、password(必填项)password用哈希算法保存到数据库;
- is_staff:用户是否拥有网站的管理权限;
- is_active:是否允许用户登陆,设置为"False",可以不用删除用户来禁止用户登陆;
1.is_authenticated()
如果是真正的User对象,返回值恒为True。用于检查用户是否已经通过了认证。通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功通过了认证。这个方法很重要,在后台用request.user.is_authenticated()判断用户是否已经登陆,如果True则,可以向前台展示request.user.name。
2.创建用户:create_user
from django.contrib.auth.models import User
user = User.objects.create_user(username="", password="", email="")
3.密码检查:check_password(password)
用户需要修改密码的时候,首先输入原来的密码,如果给定的字符串通过了密码检查,返回True;
4.修改密码:set_password()
user = User.objects.get(username="username")    # 获取用户对象
user.set_password(password="password")        # 设置对象密码
user.save()
四、简单示例
1.登陆
def log_in(request):
	print(request.POST)
	if request.method == "POST":
		username = request.POST.get("username")
		password = request.POST.get("password")
		print(username, password)
		user = auth.authenticate(username=username, password=password)	# 验证用户名和密码
		if user:
			# 如果认证成功,允许登陆;该login里面包括了session和cookie
			auth.login(request, user)
			return redirect("/login/")
		else:
			msg = "用户名或密码错误"
			return render(request, "login.html", {"msg": msg})
	return render(request, "login.html")
2.修改密码
def change_pwd(request):
	if request.method == "POST":
		old_passwd = request.POST.get("old_passwd")
		new_passwd = request.POST.get("new_passwd")
		# 得到当前登陆的用户,判断旧密码是不是和当前的密码一样
		username = request.user		# 当前登陆的用户名
		user = User.objects.get(username=username)	# 查看用户
		result = user.check_password(old_passwd)	# 检查密码是否正确
		if result:
			user.set_password(new_passwd)	# 如果密码正确,则设置新密码
			user.save()	# 保存新密码
			return redirect("/login/")
		else:
			msg = "密码输入有误"
			return render(request, "set_passwd.html", {"msg": msg})
		return render(request, "set_passwd.html")
3.注册和注销
def register(request):
	if request.method == "POST":
		username = request.POST.get("username")
		password = request.POST.get("password")
		# 得到用户输入的用户名和密码创建新的用户
		User.objects.create_user(username=username, password=password)	# User是一个对象
		msg = "注册成功,恭喜!"
		return redirect("/login/")
	return render(request, "register.html")
def log_out(request):
	auth.logout(request)
	return redirect("/login/")
Django 2.0 学习(17):Django 用户认证(auth模块)的更多相关文章
- Django【第9篇】:Django之用户认证auth模块
		用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码 ... 
- Django自带的用户认证auth模块
		一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ... 
- Django之用户认证—auth模块
		用户认知———auth模块 目录: auth模块 User对象 实例 扩展默认的auth_user表 - 创建超级用户 - python3 manager.py createsuperuser - 认 ... 
- Django框架----用户认证auth模块
		一.auth模块 auth模块:针对auth_user表 创建超级管理用户命令: Python manage.py createsuperuser添加用户名添加密码(至少8位)确认密码添加邮箱(可为空 ... 
- Django之用户认证auth模块
		一 Django中的auth模块: 我们在使用模块之前要先导入模块: from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介 ... 
- 用户认证--------------auth模块
		一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ... 
- 用户认证--auth模块实现
		转载文章,如有不妥之处请谅解 相关介绍 auth auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管 ... 
- 用户认证auth模块
		一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ... 
- Django之用户认证auth模块使用
		Auth认证模块 执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法 ... 
随机推荐
- 客户端与服务器端同步Evernote
			原文地址:http://www.zhihu.com/question/20238731 Evernote的同步方式是 以本地为基准同步到网络 还是 以网络为基准同步到本地 的? 若客户端从未与服务器端 ... 
- 使用装饰器@property
			1.在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 98s.score = 1000 # 属性 ... 
- DE1-SOC开发板使用学习
			1. Yocto build utility 工具是什么?Linux Console with framebuffer是什么? 2. 文档里面有几个Linux发布版本的,分别是ubuntu和LXDE版 ... 
- java nio通过ByteBuffer输出文件信息
			1.通过ByteBuffer的get()方法每次读取一个字节转换成char类型输出. fc = new FileInputStream("src/demo20/data.txt") ... 
- 【CentOS】安装Docker教程
			前提条件 Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上. Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位 ... 
- sublime3配置java开发环境
			链接:http://www.jianshu.com/p/48a524a4f63c 或者:http://www.jianshu.com/p/9d167c4c4feb 侵权删! 
- 回归Qt——写在Qt5.10发布之日
			今天偶然看到一条关于Qt5.10发布的消息,发现Qt经历了诺基亚风波之后发展得依然良好,感到很欣慰.回头看上次关注Qt技术还是2011年,那时候用Qt4.7做一个小项目,对于一个写Win32界面和MF ... 
- mysql查看锁表与解锁
			查看锁表语句 show OPEN TABLES where In_use > 0; 找到锁表的进程 show processlist; 删除锁表进程 kill 51045123; 
- 5个最优秀的微信小程序UI组件库
			开发微信小程序的过程中,选择一款好用的组件库,可以达到事半功倍的效果.自从微信小程序面世以来,不断有一些开源组件库出来,下面5款就是排名比较靠前,用户使用量与关注度比较高的小程序UI组件库.还没用到它 ... 
- JavaScript设计模式-----命令模式的简单应用
			命令模式是最简单和优雅的模式之一,命令模式中的命令(command)是指一个执行某些特定事情的指令. 应用场景:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道被请求的操作是什么, ... 
