django User对象


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','793390457@qq.com','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)