用Auth模块就用全套,该模块默认使用auth_user表,django的admin后台管理也用auth_user表
以下代码中有以下方法
auth.authenticate(request,username=username,password=password)
1.自动查找auth_user表
2.自动给密码加密再比对
auth.login(request,user_obj) 执行了该方法,就可以在任何地方通过request.user获取到当前登录的用户对象
login_required 登录认证装饰器
request.user.is_authenticated) #返回布尔值,用于判断当前用户是否已登录
request.user.check_password(old_password)
request.user.set_password(new_password)
auth.logout(request)
User.objects.create_user(username=username,password=password)创建用户,后台密码是密文的
#创建管理员用户的命令
python8 manage.py createsuperuser
from django.contrib import auth
#登录功能
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)
if user_obj:
# 保存用户状态
# 执行了以下方法,就可以在任何地方通过request.user获取到当前登录的用户对象
# 类似于执行request.session['key']=user_obj
auth.login(request,user_obj)
return redirect('/app02/home/')
# target_url=request.GET.get('next')
# if target_url:
# obj = redirect(target_url)
# else:
# obj=redirect('/app02/home/')
# obj.set_cookie('username','jason',max_age=3)
# return obj
return render(request,'login02.html')
from django.contrib.auth.decorators import login_required
#login_required是一个装饰器
# 用户没有登录时访问/home/,会跳转到指定login_url的网址,这里是局部配置,每一个方法的login_url可以不同,也可以在配置文件中加入:LOGIN_URL = '/app02/login/',这样是全局配置,在没有登录时访问每一个被@login_required装饰的方法,都会跳转到/app02/login/,局部的优先级高于全局
@login_required(login_url='/app02/login/')
def home(request):
# 执行request.user语句,会自动去django_session表中查找对应的用户对象封装到request.user中
print(request.user) #获取当前登录用户
print(request.user.is_authenticated) #返回布尔值,用于判断当前用户是否已登录
return HttpResponse('这是home页面,只有登录以后才可以看到')
#修改密码
@login_required
def set_password(request):
if request.method=='POST':
old_password=request.POST.get('old_password')
new_password=request.POST.get('new_password')
confirmed_password=request.POST.get('confirmed_password')
if new_password==confirmed_password:
# 校验旧密码是否正确,返回布尔值
is_right=request.user.check_password(old_password)
if is_right:
# 修改密码,这一步只修改对象属性
request.user.set_password(new_password)
# 这一步才是真正的操作数据库
request.user.save()
return redirect('/app02/login/')
return render(request,'set_password.html',locals())
#登出
def logout(request):
auth.logout(request) #类似于request.session.flush()
return redirect('/app02/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')
#create_user创建用户,后台密码是密文的
User.objects.create_user(username=username,password=password)
return HttpResponse('注册成功')
return render(request, 'register.html')
扩展auth_user表
在数据库迁移命令后,用户表要基于auth_user表,会出错,需要
- 把所有普通app下的迁移文件全删除
- admin和auth这两个(实质上也是app)的迁移文件删除
- 先将数据库中的数据导出,然后删库,重新迁移
from django.contrib.auth.models import User,AbstractUser
class UserInfo(AbstractUser):
'''
如果继承了AbstractUser,那么在执行数据库迁移命令时,auth_user表就不会被创建出来了
而UserInfo表中会有auth_user表中所有的字段,以及自己扩展的字段
前提:
1.在继承之前没有执行过数据库迁移命令,auth_user表还没有被创建,否则要换一个新库
2.继承的类里面的字段名不要覆盖AbstractUser里面的字段名
3.需要在配置文件中告诉django:要用UserInfo表替换auth_user表,再执行迁移命令
AUTH_USER_MODEL='app02.UserInfo' 应用名.类名 不是:应用名.模块文件名.类名
'''
phone = models.CharField(verbose_name='手机号', max_length=16,null=True,blank=True)
'''
null=True,告诉数据库该字段可以为空
blank=True,告诉admin后台管理该字段可以为空
'''
avatar = models.FileField(verbose_name='用户头像',upload_to='avatar/', default='avatar/2014.png')
create_time = models.DateField(auto_now_add=True)
blog = models.OneToOneField(to='Blog', null=True,on_delete=models.CASCADE)
class Meta:
# 修改admin后台管理默认的表名
verbose_name_plural='用户表'
def __str__(self):
return self.username
'''
models.CASCADE
models.DO_NOTHING
删除关联数据,数据库会报错
models.SET_NULL
删除关联数据,与之关联的值设置为空null,前提是外键字段可以设置为空
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值,前提是外键字段需要设置默认值
'''
浙公网安备 33010602011771号