一、引入
在我们创建完Django项目之后,点击urls.py会发现有一个path('admin/', admin.site.urls),
的路由,那这个是什么呢?
输入127.0.0.1::8000/admin
我们可以看见这个管理员的登录页面
那我们没有用户名和密码啊,这怎么登录进去?
所以我们需要创建一个管理员(超级用户),在命令行输入
python manage.py createsuperuser
输完一些信息之后,我们会得到一个管理员账户,那负责这些用户的信息又在哪?
当创建好一个Django项目之后直接执行数据库迁移命令会自动生成很多表,这些表中的auth_user
存储的就是我们的用户信息。
Django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user
表,并且是依赖于auth_user表完成用户相关的所有功能
二、方法总结
1、校验密码是否正确
from django.contrib import auth
# (1) 取到前端输入的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# (2) 进行用户名和密码的校验 ---- 参数必须传用户名和密码
user_obj = auth.authenticate(request, username=username, password=password)
# [1] 用户名和密码正确的情况下
print(user_obj)
# dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
print(user_obj.username)
# dream
print(user_obj.password)
# pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=
# [2] 用户名和密码不正确的情况下
print(user_obj) # None ---- 如果数据不符合则返回None
2、保存用户状态
# 判断当前用户是否存在 --- 存在则有值,不存在则返回None
if user_obj:
# 保存用户状态
auth.login(request, user_obj) # 类似于 request.session[key] = user_obj
# 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象
3、判断当前用户是否登录
# 判断用户是否登陆
# 匿名用户返回 False 正常用户返回 True
print(request.user.is_authenticated())
4、获取当前登录的用户
print(request.user)
# 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
# 未登录访问: AnonymousUser ---- 匿名用户
# 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中
5、检验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
# 局部配置
@login_required(login_url='/login/') # 局部配置:用户没有登录的情况下跳转到login_user后面指定的网址
# 全局配置
@login_required
LOGIN_URL = '/login/
- 如果全局和局部都有,该听谁的?
- 局部 > 全局
- 局部和全局哪个比较好?
- 全局的好处在于无需重复写代码。但是跳转的页面却很单一
- 局部的好处在于不同的视图函数在用户没有登录的情况下可以跳转到不同的页面
6、校验原密码
# 校验旧密码是否相同
is_right = request.user.check_password(old_password) # 内部自己加密密码进行比对
# 返回的结果为 True 或者 False
7、修改密码
# 修改密码
request.user.set_password(confirm_password) # 仅仅在修改对象的属性
# 修改完密码后进行保存数据
request.user.save()
8、注销登录用户
auth.logout(request)
# 清空当前登录用户的数据 ----- request.session.flush()
9、注册
# 操作auth_user表写入数据
# 会写入数据,但是保存的密码是明文的,没有加密
User.objects.create(username=username, password=confirm_password)
# 创建普通用户
User.objects.create_user(username=username, password=confirm_password)
# 创建超级用户 - 了解 --- 使用代码创建超级用户,邮箱和密码是必填的,而用命令创建可以忽略邮箱
User.objects.create_superuser(username=username, password=password,email=email)
三、如何扩展auth_user表
1、方式一(一对一关系 不推荐使用)
from django.db import models
from django.contrib.auth.models import User, AbstractUser
# Create your models here.
# 扩展 auth_user 表
# 第一种方式 : 一对一关系(不推荐)
class UserDetail(models.Model):
phone = models.CharField(max_length=32)
user = models.OneToOneField(to='User', on_delete=models.CASCADE)
2、方式二(面向对象的继承)
from django.db import models
from django.contrib.auth.models import User, AbstractUser
class UserInfo(AbstractUser):
"""
如果继承了AbstractUser
那么在执行数据库迁移命令的时候auth_user表就不会再被创建出来了
而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段
这么做的好处在于你能够直接点击自己的表更加快速的完成操作及扩展
前提:
1.在继承之前没有执行过数据库迁移命令(auth_user没有被创建),如果当前库已经创建了这个表,那么就重新换一个库
2.继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
3.需要再配置问价那种告诉django你要用UserInfo替代auth_user(******)
AUTH_USER_MODEL = 'app01.UserInfo',不要使用'应用名。models.表名',这是错的
"""
phone = models.BigIntegerField()
3、注意事项
需要再配置文件中声明 Django 要使用 UserInfo
替代 auth_user
AUTH_USER_MODEL = 'app01.UserInfo' ---'应用名.表名'
如果把自己写的表替代了auth_user
表,那么auth
模块的功能还是照常使用,参考的表也由原来的auth_user
编程了UserInfo