一:什么是Auth模块
就是django默认的用户认证系统:现包括用户注册、用户登录、用户认证、注销、修改密码等功能
二:如何使用auth模块
首先导入模块:
# 导入auth模块 from django.contrib import auth # 导入django的auth_user表 from django.contrib.auth.models import User
使用auth模块实现用户的注册:
def auth_register(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # auth.authenticate:重auth_user中拿去数据生成一个user对象 user_obj = auth.authenticate(request,username=username) # 如果对象已经存在就终止注册 if user_obj: return HttpResponse('当前用户已存在') # 此过程是创建普通用户 # User.objects.create_user(username=username,password=password) # 此过程是创建超级用户 User.objects.create_superuser(username=username,password=password,email='123@163.com') return render(request,'auth_register.html')
ps:超级用户和普通用户的区别:
1:超级用户可以登陆django自带的后台管理系统,而普通用户不可以
2:超级用户在创建时必须指定email,而普通用户可以不指定。
3:超级用户在用户表中的is_superuser的字段是储存的是1,而普通用存储的是0。
使用auth模块实现用户的登陆:
# 导入auth模块 from django.contrib import auth # 导入django的auth_user表 from django.contrib.auth.models import User 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) if user_obj: # 记录用户状态 request.session['name'] = username auth.login(request,user_obj) # 一旦记录了,可以在任意的地方通过request.user获取到当前登录对象 return HttpResponse('ok') return render(request,'auth_login.html')
ps:登陆的特点在于:
1:只要成功实行了auth.login(request,user_obj)之后,就会从其他任意视图函数中通过request.user_obj获取登陆用户对象。
2:当没有执行auth.login,request.user打印出来的是匿名用户。
3:request.user.is_auth可以判断request.user是否通过auth_login登陆。
注销:
def auth_logout(request): auth.logout(request) # request.session.flush() return HttpResponse('ok')
修改密码:
def auth_password(request): print(request.user.password) is_res = request.user.check_password('jason123') # 校验密码是否一致 if is_res: request.user.set_password('666') # 设置新密码 request.user.save() # 修改密码必须save保存 不然无效 return HttpResponse('ok')
使用装饰器校验登陆以及是否跳转:
from django.contrib.auth.decorators import login_required @login_required(login_url='/auth_login/') # 局部配置,校验失败则跳转到指定页面 def auth_home(request): return HttpResponse('home必须登录才能访问') @login_required(login_url='/auth_login/') def auth_xxx(request): return HttpResponse('xxx必须登录才能访问')
在setting中配置自动跳转:
LOGIN_URL = '/auth_login/'
三:如何扩张auth_user表:
采用面向对象继承的方法:
from django.contrib.auth.models import User,AbstractUser class UserInfo(AbstractUser): phone = models.CharField(max_length=32)
需要在配置文件中,指定我们不再使用的auth_user表而是使用我自己创建的userinfo表:
settings.py
# 告诉django不再使用默认的auth_user,而使用我们自己定义的表 # AUTH_USER_MODEL = "app名.models里面对应的模型表名" AUTH_USER_MODEL = 'app01.Userinfo'