用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表,会出错,需要

  1. 把所有普通app下的迁移文件全删除
  2. admin和auth这两个(实质上也是app)的迁移文件删除
  3. 先将数据库中的数据导出,然后删库,重新迁移
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
删除关联数据,与之关联的值设置为默认值,前提是外键字段需要设置默认值
'''