django User对象 Django实现登录和注册 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) Django实现登录和注册