Auth模块
Auth 模块
使用 auth 模块就全套用
在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表
django session
auth user
django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是
auth user表,并且还必须是管理员用户才能进入
创建超级用户(管理员)
python3 manage.py createsuperuser
依赖于auth_user表完成用户相关的所有功能
Auth 模块方法
模块导入
from django.contrib import auth # 主要模块
from django.contrib.auth.models import User # 用户表
和用户表中数据比对
def login(request):
if request.method =='POST':
username request.POST.get('username')
password request.POST.get('password')
#去用户表中校验数据
#1.表如何获取
#2.密码如何比对
res = auth.authenticate(request,username=username,password=password) # 用户对象
如果数据不符合 返回 None
1.自动查找auth_User标签
2,自动给密码加密再比对
该方法注意事项
括号内必须同时传入用户名和密码 不能只传用户名
return render(request'login.html')
Django 中的内置的判断用户是否存在
if user_obj:
# 保存用户状态
auth.login(request,user_obj) # 这句类似于request.session[key] = user_obj
执行了改方法来保存用户的session 信息,那么就可以在任何地方通过request.user 获取到当前登陆的用户对象
那么如果 用户没有登陆 返回的对象信息 就是 AnonymousUser 匿名用户
-
判断用户是否登陆
request.user.is_authenticated()
返回 bool 值 -
auth 模块中的登陆装饰器
from django.contrib.auth.decorators import login_required
@login_reuqired
def home()
控制 跳转到指定的页面中 局部配置
@login_required(login_url = '/login/')
如果当前没有登陆 那么就会跳转到这个页面中
全局配置 在 settings 中添加局部大于局部
LOGIN_URL = '/login/'
修改密码
@login_required
def set_password(request):
if request.method =='POST'
old_password request.POST.get('old_password'
new_password request.POST.get('new_password')
confirm_password request.POST.get('confirm_password')
#先校验两次密码是否一致
if new_password =confirm_password:
#校验老密码对不对
is_right=request.User,check_password(oLd_password)#自己加码比对密码
if is_right:
#修改密码
request.user.set_password(new_password) # 放置新密码 仅仅只是修改对象的属性
request.user.save() # 这一步才是真正的操作数据库
return redirect('/login/')
return render(request'set_password.html'Locals())
注销功能
@login_required
def logout(request):
auth.logout(request) #类似于request.session.flush()
return redirect('/login/')
注册功能
from django.contrib.auth.models import User
def register(request):
if request.method =='POST'
username request.POST.get('username')
password request.POST.get('password'
#操作auth_user表写入数据
# User.objects.create(username:=username,password=password)#写入数据不能用create密码
#创建普通用户
User.objects.create_user(username=username,password=password)
#创建超级用户(了解):使用代码创建超级用户邮箱是必填的而用命令创建则可以不填
User.objects.create_superuser(username=username email='1230qq.com'password=password)
return render(request,'register.html')
总结
- 创建普通用户:根据auth_user表添加,username字段必填
User.objects.create_user(username=,)
- 创建管理员用户:根据auth_user表添加,username、password、email字段必填
User.objects.create_superuser(username=,password=,email=)
- 验证用户名和密码是否正确:返回一个用户对象,可以获取其他字段信息,用户名和密码错误返回None。
user_obj = auth.authenticate(request,username=username,password=password)
- 保存用户登录状态:自动帮你操作session相关
auth.login(request, user_obj)
- 获取当前用户对象:返回当前登录的用户对象,没有登录则返回AnonymousUser对象,里面没有信息
user_obj = request.user
- 判断当前用户是否登录:返回布尔值
request.user.is_authenticated()
- 比对密码是否与当前登录用户相同:返回布尔值 密码为新密码
request.user.check_password('password')
- 修改密码:需要保存
request.user.set_password('new_password')
此处仅仅只是修改属性
request.user.save() # 同步到数据库中
- 注销当前已登录用户:即删除seesion
auth.logout(request)
- 校验登录装饰器:
from django.contrib.auth.decorators import login_required
# 局部配置:login_url即未登录用户跳转的路由地址
@login_required(login_url='/login/')
# 全局配置:默认跳转到/accounts/login/
@login_required
#可以在settings.py配置文件中配置全局:
LOGIN_URL = '/login/' # 在配置文件中添加路由地址
auth 表的扩展
方法一 是一对一扩展
不做描述
面对对象继承
如果继承了AbstractUser
那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了
而UserInfo表中会出现aUth_User所有的字段外加自己扩展的字段
这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展
前提:在继承之前没有执行过数据库迁移命令(auth_User)没有被创建
如果已经创建了 那么就需要重新换一个库函数
继承的类里面不要覆盖 AbstractUser 里面的字段名
需要在配置文件后再声明 替换 原来的 auth 用户表
AUTH_USER_MODEL = 'app01.userInfo'
应用名+表名
第二种:面向对象的继承
class UserInfo(AbstractUser):
phone models.BigIntegerField()
你如果自己写表替代了auth user那么
auth模块的功能还是照常使用,参考的表页由原来的auth_user变成了UserInfo