拉勾教育Django笔记内置的用户系统
Django中有一个内置的用户系统,包含了用户模型的定义、用户的分组、登录验证、权限的定义和管理等,可以帮助我们非常快速地创建用户模型以及实现用户管理相关的一系列功能。当然,也可以不采用内置的用户管理系统,自己重新定义用户模型和对用户的管理操作,具体使用哪种方式还是需要看个人习惯和实际工作来定。拉勾IT课小编为大家分解
一、用户模型
1. 默认的用户模型
默认的用户模型,即User模型类,这是Django内置用户系统的核心,源码位置在d***ntrib.auth.models.User。
User模型的主要字段如下:
• username:用户名。不能为空,且必须。
• first_name:姓名的first_name。可以为空。
• last_name:姓名的last_name。可以为空。
• email:邮箱。可以为空。
• password:密码。经过哈希过后的密码。
• groups:分组。一个用户可以属于多个分组,一个分组也可以拥有多个用户。和Group模型是多对多的关系。
• user_permissions:权限。一个用户可以拥有多个权限,一个权限也可以被多个用户使用。和Permission模型是多对多的关系。
• is_staff:是否是员工。表示是否可以进入到admin(管理员)的站点。
• is_active:是否可用。对于一些不再使用或者暂时不使用的数据,可以将这个值设置为False即可。
• is_superuser:是否是超级管理员。通常超级管理员拥有整个网站的所有权限。
• last_login:上次登录的时间。
• date_joined:创建的时间。
2. 常用基础操作
这里介绍一些常用的基础操作,只是作为参考,深入了解后可以根据自身需要来使用。
创建用户
可以通过create_user方法快速创建一个普通用户,通过create_superuser方法快速创建一个超级用户,创建超级用户还可以通过终端命令行的方式python manage.py createsuperuser。
# 导入内置的User模型
from d***ntrib.auth.models import User
from django.http import HttpResponse
def index(request):
# create_user创建一个普通用户
user = User.objects.create_user(username='zhangsan', email='zhangsan@q***', password='123456')
# create_superuser创建一个超级用户
super_user = User.objects.create_superuser(username='lisi', email='lisi@q***', password='123456')
return HttpResponse('index')
修改密码
在Django内置的用户系统中有一个针对密码的密码哈希系统,密码是经过加密后存储在数据库中的,修改用户的密码时不能直接使用password=xxx重新赋值的方式来修改,需要使用特定的方法set_password来重置密码。因为涉及到密码的加密和解密,所以其他关于密码的操作大多也是需要使用特定的方法来进行操作的。
from d***ntrib.auth.models import User
# 随意获取一个用户,并给他重置密码
user = User.objects.get(pk=1)
user.set_password('654321')
user.save()
密码验证
可以使用authenticate函数进密码验证,会同时验证用户名和密码,验证成功后会返回一个User对象。
from d***ntrib.auth import authenticate
from django.http import HttpResponse
def index(request):
username = 'zhangsan'
password = '123456'
user = authenticate(request, username=username, password=password)
if user:
return HttpResponse('验证成功!')
else:
return HttpResponse('用户名或密码错误!')
3. 扩展User模型
默认的User模型肯定是不能满足我们的实际需要的,比如我们一般不用first_name和last_name两个字段来定义一个人的姓名,再比如我们通常使用邮箱或者手机号作为用户的标识,而不是使用username,所以我们就需要根据实际情况来扩展或自定义User模型。扩展或自定义User模型主要有以下四种方法,可以根据实际需要来使用。
1)proxy代理扩展
这种方式需要定义一个代理类,通过操作代理类以达到扩展User模型的目的。代理类的定义方式Django已经为我们规定好了:代理类继承User模型,并在内部类Meta中指定proxy为True即可,随后可以根据自身需要定义额外的属性和方法了。
但是需要注意,Django内置的这种代理是不能在代理类中添加新的字段的,如telephone = models.CharField(max_length=11),但是可以添加其他普通的属性和方法。所以使用代理的方式缺点也比较明显,就是扩展性较差。
from d***ntrib.auth.models import User
# 代理类需要继承User
class Person(User):
# 在内部类Meta中指定proxy=True
class Meta:
proxy = True
# 添加额外的方法
@classmethod
def get_blacklist(cls):
return cls.objects.filter(is_active=False)
2)一对一关系外键扩展
这种方式是将User模型当作一个外键,但是需要定义为一对一的关系,同时还需要定义一个信号去User模型的save方法,以保证扩展的类和User模型在修改上的同步。
这种方式相比于代理的方式,优势在于可以添加一些额外的字段了。
from django.db import models
from d***ntrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save
一、用户模型
1. 默认的用户模型
默认的用户模型,即User模型类,这是Django内置用户系统的核心,源码位置在d***ntrib.auth.models.User。
User模型的主要字段如下:
• username:用户名。不能为空,且必须。
• first_name:姓名的first_name。可以为空。
• last_name:姓名的last_name。可以为空。
• email:邮箱。可以为空。
• password:密码。经过哈希过后的密码。
• groups:分组。一个用户可以属于多个分组,一个分组也可以拥有多个用户。和Group模型是多对多的关系。
• user_permissions:权限。一个用户可以拥有多个权限,一个权限也可以被多个用户使用。和Permission模型是多对多的关系。
• is_staff:是否是员工。表示是否可以进入到admin(管理员)的站点。
• is_active:是否可用。对于一些不再使用或者暂时不使用的数据,可以将这个值设置为False即可。
• is_superuser:是否是超级管理员。通常超级管理员拥有整个网站的所有权限。
• last_login:上次登录的时间。
• date_joined:创建的时间。
2. 常用基础操作
这里介绍一些常用的基础操作,只是作为参考,深入了解后可以根据自身需要来使用。
创建用户
可以通过create_user方法快速创建一个普通用户,通过create_superuser方法快速创建一个超级用户,创建超级用户还可以通过终端命令行的方式python manage.py createsuperuser。
# 导入内置的User模型
from d***ntrib.auth.models import User
from django.http import HttpResponse
def index(request):
# create_user创建一个普通用户
user = User.objects.create_user(username='zhangsan', email='zhangsan@q***', password='123456')
# create_superuser创建一个超级用户
super_user = User.objects.create_superuser(username='lisi', email='lisi@q***', password='123456')
return HttpResponse('index')
修改密码
在Django内置的用户系统中有一个针对密码的密码哈希系统,密码是经过加密后存储在数据库中的,修改用户的密码时不能直接使用password=xxx重新赋值的方式来修改,需要使用特定的方法set_password来重置密码。因为涉及到密码的加密和解密,所以其他关于密码的操作大多也是需要使用特定的方法来进行操作的。
from d***ntrib.auth.models import User
# 随意获取一个用户,并给他重置密码
user = User.objects.get(pk=1)
user.set_password('654321')
user.save()
密码验证
可以使用authenticate函数进密码验证,会同时验证用户名和密码,验证成功后会返回一个User对象。
from d***ntrib.auth import authenticate
from django.http import HttpResponse
def index(request):
username = 'zhangsan'
password = '123456'
user = authenticate(request, username=username, password=password)
if user:
return HttpResponse('验证成功!')
else:
return HttpResponse('用户名或密码错误!')
3. 扩展User模型
默认的User模型肯定是不能满足我们的实际需要的,比如我们一般不用first_name和last_name两个字段来定义一个人的姓名,再比如我们通常使用邮箱或者手机号作为用户的标识,而不是使用username,所以我们就需要根据实际情况来扩展或自定义User模型。扩展或自定义User模型主要有以下四种方法,可以根据实际需要来使用。
1)proxy代理扩展
这种方式需要定义一个代理类,通过操作代理类以达到扩展User模型的目的。代理类的定义方式Django已经为我们规定好了:代理类继承User模型,并在内部类Meta中指定proxy为True即可,随后可以根据自身需要定义额外的属性和方法了。
但是需要注意,Django内置的这种代理是不能在代理类中添加新的字段的,如telephone = models.CharField(max_length=11),但是可以添加其他普通的属性和方法。所以使用代理的方式缺点也比较明显,就是扩展性较差。
from d***ntrib.auth.models import User
# 代理类需要继承User
class Person(User):
# 在内部类Meta中指定proxy=True
class Meta:
proxy = True
# 添加额外的方法
@classmethod
def get_blacklist(cls):
return cls.objects.filter(is_active=False)
2)一对一关系外键扩展
这种方式是将User模型当作一个外键,但是需要定义为一对一的关系,同时还需要定义一个信号去User模型的save方法,以保证扩展的类和User模型在修改上的同步。
这种方式相比于代理的方式,优势在于可以添加一些额外的字段了。
from django.db import models
from d***ntrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save