Django用户认证user对象
一、内置auth_user表
(1) 表结构
mysql> desc auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| password | varchar(128) | NO | | NULL | |
| last_login | datetime(6) | YES | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| username | varchar(150) | NO | UNI | NULL | |
| first_name | varchar(30) | NO | | NULL | |
| last_name | varchar(30) | NO | | NULL | |
| email | varchar(254) | NO | | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| date_joined | datetime(6) | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
(2) 创表语句
mysql> show create table auth_user\G
*************************** 1. row ***************************
Table: auth_user
Create Table: CREATE TABLE `auth_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(128) NOT NULL,
`last_login` datetime(6) DEFAULT NULL,
`is_superuser` tinyint(1) NOT NULL,
`username` varchar(150) NOT NULL,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(30) NOT NULL,
`email` varchar(254) NOT NULL,
`is_staff` tinyint(1) NOT NULL,
`is_active` tinyint(1) NOT NULL,
`date_joined` datetime(6) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
(3) 系统内置的user模型进行导入
from django.contrib.auth.models import User
二、内置的属性与方法
导入:
from django.contrib.auth.models import User
django模型类中 内置了许多的属性与方法 我们可以直接使用
(1) is_staff
Boolean 决定用户是否可以访问admin管理界面 默认False
(2) is_active
Boolean 用户是否活跃 默认True 一般不删除用户 而是将用户的is_active设置为False
(3) is_authenticated()
Boolean 用户是否通过验证登录
使用实例:
request.user.is_acthenticated()
返回值Boolean
(4) make_password(password)
给密码加密 django自带的加密功能是hash加盐
(5) check_password(password)
检查用户输入的密码是否正确
(6) set_password(password)
修改用户密码
(7) authenticate()
Boolean 认证用户名和密码是否正确(处理登录功能)
导入:
from django.contrib.auth import authenticate,login,logout
参数:
authenticate(username=username,password=password)
(8) create_user()
添加用户
格式:
from django.countrib.auth.models import User
User.objects.create_user('lucky','[email protected]','123456')
(9) last_login
上次登录时间 自动保存 不要自己添加代码
(10) request.user.username
获取当前登录用户的用户名
(11) login_required
设置视图函数必须登录才能访问
导入:
from django.contrib.auth.decorators import login_required
@login_required(login_url='/')
def test(req):
pass
(12) logout login
退出登录 登录
三、注册
代码实例:
from django.contrib import messages
from django.shortcuts import render,HttpResponse
from django.contrib.auth.models import User # 导入系统内置的user模型
import os
# 注册功能
def register(req):
if req.method == 'POST':
try:
# 获取传递过来的数据
username = req.POST.get('username')
userpass = req.POST.get('userpass')
email = req.POST.get('email')
# 将用户数据保存在数据库中
u = User.objects.create_user(username,email,userpass,is_active=False)
u.save()
# 配置发送邮件进行激活
u.email_user('账户激活','',os.environ.get('MAIL_USER'),html_message='<a href="">激活</a>')
messages.success(req,'注册成功 激活邮件已经发送 请前去激活~')
except:
messages.error(req,'目前繁忙 请稍后在试~')
return render(req,'user/register.html')
注意:
因为在创建用户的时候 设置is_active为False 那么在登录认证的时候 会进行判断 也就是激活状态为False 认证失败
四、用户认证
# 用户认证
def login(req):
if req.method == 'POST':
# 获取传递过来的数据
username = req.POST.get('username')
userpass = req.POST.get('userpass')
# 处理登录功能 也就是用户认证
u = authenticate(username=username,password=userpass)
if not u:
messages.error(req,'当前用户登录失败 请检查用户名密码或激活状态')
return redirect(reverse('App:login'))
# 处理登录
Login(req,u)
messages.success(req,'登录成功!')
return redirect(reverse('App:index'))
return render(req,'user/login.html')
注意:
登录authenticate会验证用户名密码以及is_active是否激活 所以注意激活操作
五、修改密码
# 修改密码
def update_password(req):
if req.method == 'POST':
# 获取传递过来的数据
username = req.POST.get('username')
userpass = req.POST.get('userpass')
newuserpass = req.POST.get('newuserpass')
# 处理登录功能 也就是用户认证
u = authenticate(username=username, password=userpass)
if not u:
messages.error(req,'当前用户认证失败')
return redirect(reverse('App:update_password'))
u.set_password(newuserpass)
u.save()
messages.success(req,'密码修改成功!')
return redirect(reverse('App:login'))
return render(req,'user/update_password.html')
六、在模板中判断是否登录
django自带用户认证授权系统
base.html
{% if request.user.is_authenticated %}
<li><a>欢迎:{{ request.user.username }}</a></li>
{% endif %}
七、在视图函数中获取登录对象数据
# 在视图函数中测试获取登录用户的数据
def test(req):
if req.user.is_authenticated():
print(req.user.username)
return HttpResponse('测试在视图函数中获取登录对象')
八、没登录禁止访问登录路由地址 login_require
导入:
实例:
from django.contrib.auth.decorators import login_required # 必须登录才能访问
# 在视图函数中测试获取登录用户的数据
# 当前test为必须登录才能访问
# 没登录跳转到当前指定的端点
# @login_required(login_url='/login/')
# 跳转到当前settings.py指定的端点
@login_required
def test(req):
if req.user.is_authenticated():
print(req.user.username)
return HttpResponse('测试在视图函数中获取登录对象')
可以在settings.py进行全局配置跳转的端点
实例:
# 全局设置login_require
LOGIN_URL = '/login'
九、退出登录
导入:
from django.contrib.auth import authenticate,login as Login,logout as Logout # 用户认证方法
实例:
# 退出登录
def logout(req):
Logout(req)
messages.success(req, '退出成功!')
return redirect(reverse('App:index'))
十、自定义用户表
说明:
给auth_user的模型表添加新字段 phone和icon字段
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser # 导入user抽象类
# Create your models here.
class User(AbstractUser):
phone = models.CharField(max_length=11)
icon = models.CharField(max_length=50,default='default.jpg')
将用户模型设置为自定义的user模型类
# 更改自定义模型类
AUTH_USER_MODEL = 'App.User'
将迁移文件 和 库删除 在重新进行迁移
添加自定义用户认证(登录可以使用用户名或者手机号码进行登录)
在App下新建一个auth.py
auth.py
from django.db.models import Q
from App.models import User
from django.contrib.auth.backends import ModelBackend
class MyBackend(ModelBackend):
def authenticate(self, username=None, password=None):
user = User.objects.filter(Q(username=username)|Q(phone=username)).first()
if user:
if user.check_password(password):
return True
return None
注意:
当认证失败的时候返回值必须为None 否则报错
在settings.py添加如下代码
AUTHENTICATION_BACKENDS = (
'App.auth.MyBackend',
)
将视图函数代码更改为:
from App.models import User
u = User.objects.create_user(username,email,password,phone=phone)