登录测试
(登录注册功能)
views.py from django.shortcuts import render, HttpResponse, redirect from django.contrib import auth # Create your views here. def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 去用户表中校验数据(表不知道在哪里),密码如何比对(密码密文) user_obj = auth.authenticate(request, username=username, password=password) # print(res) # tank 用户对象 # print(res.username) # print(res.password) # 返回的是密文 # 校验用户是否存在 if user_obj: # 保存用户状态 auth.login(request, user_obj) # 类似于request.session[key]=user_obj # 只要执行了该方法,就可以再任何地方通过request.user获取到当前登录的用户对象 return redirect('/home/') ''' auth.authenticate() 1.自动查找auth_user表 2.自动给密码加密再比对 注意:括号内必须同时传用户名和密码 如果用户信息不对,则报错 ''' return render(request, 'login.html') from django.contrib.auth.decorators import login_required # 导入这个模块以后不需要写登录装饰器了 ''' 局部配置,如果用户没有登录,让它跳转到这个指定的页面 全局配置:在settings中配置 LOGIN_URL = '/login/',但是跳转页面单一 如果局部和全局配置都有,他们的优先级是: 局部>全局 ''' # 主页 # @login_required(login_url='/login/') # 局部配置,如果用户没有登录,让它跳转到这个指定的页面 @login_required def home(request): # 用户登录之后才能看到home:使用login_required模块 print(request.user) # 拿到的是用户对象,如果没有登录过,则返回的是AnonymousUser:匿名用户 # 自动去django_session表中查找对应的用户对象,然后封装到request.user中 # 判断用户是否登录过 print(request.user.is_authenticated) # 没有登录过返回false ''' 注意:is_authenticated: 返回的是布尔值,它不是方法,所有不要加() ''' return HttpResponse('OK') # @login_required(login_url='/login/') @login_required def index(request): return HttpResponse('index') # 修改密码 @login_required def change_pwd(request): if request.method == 'POST': old_pwd = request.POST.get('old_password') new_pwd = request.POST.get('new_password') re_pwd = request.POST.get('re_password') # 先校验两次密码是否一致 if new_pwd == re_pwd: # 校验老密码 is_right = request.user.check_password(old_pwd) # 这个方法自己加密去比对(返回的是布尔值) if is_right: # 修改密码(这样不会影响到数据库) request.user.set_password(new_pwd) request.user.save() # 一定要保存,这样才能影响到数据库 return redirect('/login/') return render(request, 'change_pwd.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') # User.objects.create(username=username, password=password) # 操作auth_user表写入数据,如果是普通用户的话,不能用create,这样密码是明文,要用create_user # User.objects.create_user(username=username, password=password) # 创建超级用户,邮箱是必填的 User.objects.create_superuser(username=username, password=password,email='123@qq.com') return render(request, 'register.html')
(总结)
from django.contrib import auth # 导入auth模块 from django.contrib.auth.models import User # User相当于就是auth_user表 --------------------------------------------------------------- 判断用户名是否存在 res = User.objects.filter(username=username) if res: return HttpResponse('用户名已存在') ---------------------------------------------------------------- 1.用户注册功能 User.objects.create_user(username=username, password=password) # 会自动对密码加密然后讲所有数据放到auth_user表里面去!!! # 注意User.objects.create(username=username,password=password)该方法不行,因为密码的加密无法实现,填加到表里面的密码没有加密 ----------------------------------------------------------------- 2.判断用户名和密码是否正确 user_obj = auth.authenticate(request, username=username, password=password) # 会自动将密码加密,然后拿用户名与加密后的密码到auth_user表里面去比对,如果比对一致,会返回用户对象!!! # 用用户对象就可以点出对象里面含有的数据 ------------------------------------------------------------------ 3.判断用户是否登录 request.user.is_authenticated ------------------------------------------------------------------ ------------------------------------------------------------------ 4.校验用户是否登录的 装饰器(两种情况) from django.contrib.auth.decorators import login_required 第一种情况: @login_required(login_url='/login/') # 局部配置 def index_func(request): return HttpResponse('index页面 只有登录的用户才可以查看') 装饰器对视图函数装上后,在访问该视图函数的时候,就会去校验你请求头的数据里面有没有显示你已经登录的cookie随机字符串,
如果没有标识用户登录的随机字符串,说明用户还没有登录,可以让用户的想访问该视图函数的请求自动跳到转指定的路由去,比如此处我们让没登录的用户想访问该视图函数时,自动跳转到登录的路由去!!! 装饰器还悄悄的干了:拿到想要访问的路由,利用问号携带数据的方法将想要访问的路由挂在指定跳转的登录的路由的屁股后,
这样我们在登录的视图函数里通过request.GET.get('next')就能拿到登陆前想 访问的路由,在登录成功后,还是可以控制再跳到登录前的页面去!!! if target_path: obj = redirect(target_path) # 4. 如果信息存在,就跳转到登陆前想要访问的路由去!!! else: obj = redirect('/home/') request.session.set_expiry(2419200) # 也可以设置session 的保存时间 return obj ------------------------------------------------------ 在配置文件中写一个全局配置 LOGIN_URL = '/login/' 第二种情况: from django.contrib.auth.decorators import login_required @login_required # 全局配置 这个时候用户没登录访问该视图函数也会自动跳到login路由去 def index_func(request): return HttpResponse('index页面 只有登录的用户才可以查看') ------------------------------------------------------------------- 5. auth.login(request, user_obj) 执行完该操作之后,我们可以通过request.user直接获取当前登录的用户对象 request.user是AuthenticationMiddleware类里面函数里面的代码。 ------------------------------------------------------------------- 6. 获取登录用户对象 request.user ------------------------------------------------------------------- 7. 校验原密码是否正确 request.user.check_password(原密码) ------------------------------------------------------------------- 8. 修改密码 request.user.set_password(新密码) request.user.save() -------------------------------------------------------------------- 9. 退出登录(注销登录) auth.logout(request)
【扩展auth_user表】
还想使用auth模块的功能 并且又想扩展auth_user表的字段 思路1:一对一字段关联(比较繁琐) ---------------------------------- 思路2:替换auth_user表 --------- 步骤1:模型层编写模型类继承AbstractUser from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): # 填写AbstractUser表中没有的字段 phone = models.BigIntegerField(null=True) desc = models.TextField(null=True) --------- 步骤2:一定要在配置文件中声明替换关系 AUTH_USER_MODEL = 'app01.UserInfo' --------- ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建) 如果数据库之前已经被模型层映射过了,你再映射的时候会报错!!! --------- 如果真的决定要替换AbstractUser表,一定我们写了一个类继承了AbstractUser 那就相当于准备要把auth_user替换掉,所以想做这一步操作,一定要确保从没没有执行过数据库迁移命令,
如果当前数据库之前已经做过数据 库迁移命令了,直接用mysql创一个新的库,然后连好后,再执行数据库迁移命令!!!
这样生成的表里面就没有auth_user表了,取而代之的就是app01_userinfo表了,之前所有的和auth模块相关的操作功能,就基于这张你自己创的表上面去了