auth组件
auth组件介绍
auth组件的主要作用就是替我们处理一些登录、注册、验证登录、安全退出的一些功能,
一旦你使用了系统提供的组件,如果不做任何更改,我们的用户信息都会被存到固定的表中auth-user,
而表中的字段也是固定的
auth组件功能
登录
from django.contrib import auth from django.contrib.auth.models import User # 首先导入系统的auth组件和auth组件中user的模型表 def login(request): if request.method == 'GET': return render(request,"login.html") else: username = request.POST.get("username") password = request.POST.get("password") user = auth.authenticate(request, username=username, password=password) # 参数传入用户名和密码,他会去系统表中进行查找,有相同的返回对象,没有就返回None if user: auth.login(request, user) # 调用login系统相当于做了以下三部 # 1.设置session和cookie # 2.生成request.user对象,这个对象是可以在函数视图中使用的(详情见auth中间件) # 3.request.user 相当于request.session return render(request, "blog.html")
验证
# 认证有三种方式 # 1.在需要认证的函数中认证 def authority(request): is_login = request.user.is_authenticated() # 如果已经登录就会返回True 没有就返回False # 2.通过装饰器把认证失败后跳转的url传入 from django.contrib.auth.decorators import login_required # 导入装饰器 @login_required(login_url="/test/") def authority(request): pass # 3.全局设置url,不用传参 # 在settings.py 中配置 LOGIN_URL = "/test/" @login_required def authority(request): pass
注册
def register(request): if request.method == 'GET': return render(request, "register.html") else: username = request.POST.get("username") password = request.POST.get("password") user = User.objects.filter(username=username).first() # 可以通过这种filter查看是否有该用户名的用户 if user: return HttpResponse("用户名已存在") else: # 创建普通用户账号 User.objects.create_user(username=username, password=password) # 创建超级用户账号 User.objects.create_superuser(username=username, password=password) return HttpResponse("登录去吧")
修改密码
@login_required def modify(request): # 这里时get请求处理,省略 oldpwd = request.POST.get("oldpwd") newpwd = request.POST.get("newpwd") # 判断旧密码是否正确 res = request.user.check_password(oldpwd) if res: request.user.set_password(newpwd) request.user.save() # 强调:修改完密码一定要保存,不然不会成功 return HttpResponse("ok") return HttpResponse("oldpwd 错误")
安全退出
@login_required def logout(request): auth.logout(request) # 会把你缓存和数据库中的session都清除掉 return HttpResponse("退出完成")
拓展auth表的字段
1. 创建另一张表和auth表一对一关联
from django.db import models from django.contrib.auth.models import User class NewUser(models.Model): salary = models.CharField(max_length=32, null=True) user = models.OneToOneField(to="User")
2. 面向对象,继承auth的表模型
from django.contrib.auth.models import AbstractUser class NewUser(AbstractUser): salary = models.CharField(max_length=32, null=True) # 并且需要在settings里设置不使用默认的auth表,而是使用我们自己的表 # AUTH_USER_MODEL = "app名.models里对应的模型" AUTH_USER_MODEL = "app01.NewUser"