Auth模块:用户认证html
咱们没用auth模块前的验证方法:authenticate
数据库
def auth_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') models.User.objects.filter(username = username,password = password).first() # 咱们经过django的orm查询表里有没有对应的数据,有的话登陆成功 return render(request,'auth_login.html')
用auth模块:django
def auth_login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # models.User.objects.filter(username = username,password = password).first() user_obj = auth.authenticate(request,username = username,password = password) # 至关于执行了上面的那句,获得一个用户对象,获取到的明文密码会自动转为密文去数据库比较 return render(request,'auth_login.html')
登陆成功后记录用户的登陆状态:auth.loginsession
# 记录用户状态 request.session['name'] = username # auth模块记录 auth.login(request,user_obj) # request.session保存的只是字符串,而auth保存的则是对象,一但记录了,能够在任意地方经过request.user获取到当前登陆对象,
未登陆状态取request.user 后台会返回 AnonymousUse(匿名用户)
判断当前用户是否登陆:is_authenticatedapp
request.user.is_authenticated()
# 登陆返回Ture
退出登陆:logoutui
auth.logout(request) # 至关于 request.session.flush()
用auth模块完成注册功能时记住,用就全都用authurl
保存注册用户时:create_userspa
models.User.object.create(username=username,password=password) User.objects.create(username=username,password=password) # 这里保存用户不能在用create,不然密码会以明文的形式保存 User.objects.create_user(username=username,password=password) # 建立普通用户 User.objects.create_superuser(username=username,password=password,email='123@qq.com') # 建立超级用户,登陆后台管理系统,须要邮箱。
修改密码:check_password、setpasswordcode
def auth_password(request): print(request.user.password) # 打印出来的password是密文形式 old_password = request.POST.get('old_password') # 获取用户输入的旧密码 new_password = request.POST.get('new_password') # 获取用户输入的新密码 is_res = request.user.check_password(old_password) # 去数据库比对是否正确 if is_res: request.user.setpassword(new_password) # 设置新密码 request.user.save() # 保存密码,这一步不能少,不然密码不会被修改
登陆验证:login_requiredorm
from django.contrib.auth.decorators import login_required @login_required(login_url='/login/') # 局部配置 def home(request): return HttpResponse('ok')
# 全局配置须要在settings中配置参数 LOGIN_URL = '/login/' from django.contrib.auth.decorators import login_required @login_required # 装饰器后面不须要指定跳转页面,直接跳到全局配置的页面 def home(request): return HttpResponse('ok')
想要加一个存储用户手机号的字段
咱们能够经过继承内置的 AbstractUser 类,来定义一个本身的Model类。
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):#继承AbstractUser """ 用户信息表 """ nid = models.AutoField(primary_key=True)#这样就至关于在本身的类中能够派生出新的字段 phone = models.CharField(max_length=11, null=True, unique=True)# def __str__(self): return self.username#字符串原样输出
注意:
按上面的方式扩展了内置的auth_user表以后,必定要在settings.py中告诉Django,我如今使用我新定义的UserInfo表来作用户认证。写法以下:
# 引用Django自带的User表,继承使用时须要设置,不加数据库迁移不了 AUTH_USER_MODEL = "app名.UserInfo"
再次强调:
一旦咱们指定了新的认证系统所使用的表,咱们就须要从新在数据库中建立该表,而不能继续使用原来默认的auth_user表了。