标签:abstract 返回 创建 pre redirect class 邮箱 info bsp
Auth模块是Django自带的用户认证模块
# 1.比对用户名和密码是否正确 user_obj = auth.authenticate(request,username=username,password=password) # 括号内必须同时传入用户名和密码 print(user_obj) # 用户对象 数据不符合则返回None print(user_obj.username) print(user_obj.password) # 密码是密文形式 # 2.保存用户状态 auth.login(request,user_obj) # 类似于request.session[key] = user_obj # 3.判断当前用户是否登陆 request.user.is_authenticated() # 4.获取当前登陆用户 request.user # 5.校验用户是否登陆装饰器 from django.contrib.auth.decorators import login_required # 局部配置 @login_required(login_url=‘/login/‘) # 全局配置 LOGIN_URL = ‘/login/‘ 1.如果局部和全局都有 该听谁的? 局部 > 全局 2.局部和全局哪个好呢? 全局的好处在于无需重复写代码 但是跳转的页面却很单一 局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面 # 6.比对原密码 request.user.check_password(old_password) # 7.修改密码 request.user.set_password(new_password) #修改对象的属性 request.user.save() #操作数据库 # 8.注销 auth.logout(request) # 9.注册 # 操作auth_user表写入数据 User.objects.create(username=username,password=password) # 写入数据 密码没有加密处理 # 创建普通用户 User.objects.create_user(username=username,password=password)# 密码是加密处理的 # 创建超级用户:使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填 User.objects.create_superuser(username=username,email=‘123@qq.com‘,password=password)
例子:
def login(request): if request.method == "POST": username = request.POST.get("username") pwd = request.POST.get("password") obj = auth.authenticate(request, username=username, password=pwd) print(obj) print(obj.username) print(obj.password) if obj: auth.login(request, obj) return redirect("/home/") return render(request, "login.html")
@login_required def home(request): print(request.user) print(request.user.is_authenticated()) return HttpResponse("ok")
@login_required def set_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: obj = request.user.check_password(old_pwd) if obj: request.user.set_password(new_pwd) request.user.save() return redirect("/login/") return render(request,"set_pwd.html")
@login_required def logout(request): auth.logout(request) return redirect("/login/")
前提: 1.在继承之前没有执行过数据库迁移命令 2.继承的类里面不要覆盖AbstractUser里面的字段名 3.需要在配置文件中告诉django你要用UserInfo替代auth_user AUTH_USER_MODEL =‘应用名.表名‘
两种创建方法:
from django.db import models from django.contrib.auth.models import User,AbstractUser # 第一种:一对一关系 # class UserDetail(models.Model): # phone = models.BigIntegerField() # user = models.OneToOneField(to=‘User‘) # 第二种:面向对象的继承 class UserInfo(AbstractUser): phone = models.BigIntegerField()
标签:abstract 返回 创建 pre redirect class 邮箱 info bsp
原文地址:https://www.cnblogs.com/zhenghuiwen/p/13081636.html