Django自带Auth模块

Posted on 2022-11-27 21:36  呱呱呱呱叽里呱啦  阅读(15)  评论(0编辑  收藏  举报

Django自带Auth模块

# 创建超级用户
python manage.py createsuperuser
# 使用auth模块,要用就全用


from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
# 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) # 必须同时传入用户名和密码,返回用户对象或者None
        if user_obj:
            # 保存用户状态
            auth.login(request,user_obj) #类似于request.session[''] = user_obj,执行后就可以使用request.user获取当前登录的用户对象
            return redirect('home')

    return render(request,'login.html')

@login_required(login_url='/login/') # 局部指定登录页面,优先级高于settings.py中的全局配置
def home(request):
    # if request.user.is_authenticated(): # 判断是否登录
    #     return HttpResponse('你登录了,这里是你的主页')
    return HttpResponse('这里是主页')

@login_required
def modify_pwd(request): # 修改密码
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        confirm_password = request.POST.get('confirm_password')
        if new_password == confirm_password:
            is_right = request.user.check_password(old_password) # 自动加密比对数据库
            if is_right:
                request.user.set_password(new_password) #修改对象属性
                request.user.save() # 操作数据库
    return render(request,'modify_pwd.html',locals())

@login_required
def logout(request): # 注销
    auth.logout(request) # 类似request.session.flush()
    return redirect('/login/')


def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # User.objects.create(username=username,password=password) # 会明文存储密码
        User.objects.create_user(username=username,password=password) # 创建普通
        # 创建超级用户create_superuser
    return render(request,'register.html')

auth模块小结

# 比对用户名和密码
user_obj = auth.authenticate(request,username=username,password=password) # 必须同时传入用户名和密码,返回用户对象或者None

# 保存用户状态
auth.login(request,user_obj) #类似于request.session[''] = user_obj,执行后就可以使用request.user获取当前登录的用户对象

# 判断当前用户是否登录
request.user.is_authenticated() # 判断是否登录

# 获取当前登录用户
request.user

# 校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') # 局部指定登录页面,优先级高于settings.py中的全局配置
# settings.py LOGIN_URL = '/login/' 全局配置

# 修改密码
is_right = request.user.check_password(old_password) # 自动加密比对数据库
request.user.set_password(new_password) #修改对象属性
request.user.save() # 操作数据库

# 注销
auth.logout(request)

# 注册
from django.contrib.auth.models import User
User.objects.create_user(username=username,password=password) # 创建普通用户

拓展auth_user表

class UserInfo(AbstractUser):
    '''
    如果继承了AbstractUser,在执行数据库迁移命令时就不会创建auth_user表,而会在userinfo表中包含所有auth_user表
    的字段,并包含自己拓展的字段
    但是:
    1。需要在数据库设计阶段就明确不适用auth_user表,如果当前库已经创建了auth_user表,则该库不可执行以上继承
    2.继承的类不要覆盖Abstract类中的字段名
    3.需要在配置文件中声明用userinfo替换auth_user
    AUTH__USER_MODEL = 'app01.UserInfo' 应用名.类名

    '''
    phone = models.CharField(max_length=16)

User类表如果要后期拓展字段

1.删除所有app下的迁移文件

2.删除admin & auth下的迁移文件

3.数据库转储为外部文件

4.删库

5.数据库导入