Django | 高级之 Auth模块

2023年 8月 13日 99.6k 0

Auth模块是什么

Auth模块式是jango自带的用户认证码模块

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统,此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。

Django作为一个完美主义者的中级框架,当然也会想到用户的这些痛点,所以它内置了强大的用户认证系统-Auth。它默认使用auth_user表来存储用户数据。

在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表。
auth_user表的作用:Django自带的后台管理系统所依赖的数据就在这张表中。默认情况下是空表,没有用户名和密码。因此我们需要自己创建用户数据。但是我们创建的需要是一个超级管理员才能登录

python3.10 manage.py createsuperuser

zhangjiejia@zhangjiejiasMBP Atyuki % python3.10 manage.py createsuperuser
Username (leave blank to use 'zhangjiejia'): JJ
Email address: Jeazhang828@sina.com
Password: 
Password (again): 
Superuser created successfully.

在auth_user表里面is_superuser是1就是超级用户,0就是普通用户

Auth模块常用方法

Auth模块的登录功能

from django.contrib import auth  
# Auth模块的登录功能  
def auth_login(request):  
  
    if request.method == 'POST':  
        # 接收前端传过来的数据  
        username = request.POST.get('username')  
        password = request.POST.get('password')  

        # 验证用户名和密码是否正确  
        # 1. 去哪个表中核验  
        # 2. 要哪个字段来比较  

        '''  
        这里的登录我们使用Auth模块,登录的时候我们使用的表是auth_user这张表  
        '''  

        # 查看了源码后,发现后面是**打散,所以我们用关键字参数传参  
        user_obj = auth.authenticate(request, username=username, password=password)  
        print(user_obj) # 打印出来后是 用户名。 这个就是用户登录成功之后的用户对象  
        print(user_obj.username)  
        print(user_obj.password)  

        '''  
        注意事项:  
        传递参数的时候,用户名和密码必须同时传入。  
        '''  

        # 如果登录成功  
        if user_obj:  
        # 保存用户登录的状态, 这里切记既然已经使用了auth模块就继续使用auth模块不要再自己创建方法了  
        auth.login(request, user_obj)  

        # 而且只要写了auth.login,那么就可以在全局任何有request对象的地方通过request.user拿到用户的对象  

        return redirect(request, '/home/')  
    return render(request, 'auth/auth_login.html')

Auth模块的登录验证功能

# Auth模块的验证登录功能  
@login_required(login_url='/auth_login/')  
def auth_check(request):  
    print(request.user.is_authenticated)  

    if request.user.is_authenticated:  
        # 处理登录后的逻辑  
        pass  
    else:  
        print('check')  
        # 没有登录,跳转登录界面  
        redirect('/auth_login/')  
  
    return HttpResponse("LOGGINED")

Auth模块的退出登录登录

# 退出登录功能  
def logout(request):  
    # 清除cookie或者session  
    # 因为源码中需要用到request,所以request必须传  
    auth.logout(request)  
    return redirect('/home/')

Auth模块的修改密码功能

# Auth更改密码的功能  
def set_password(request):  
  
    if request.method == 'POST':  
        print('check1')  
        old_pswd = request.POST.get('old_password')  
        new_pswd = request.POST.get('new_password')  
        aga_pswd = request.POST.get('aga_password')  

        # 先验证两次密码是否输入一直  
        if new_pswd == aga_pswd:  
            print('check2')  
            # 验证老密码是否正确,否则不让修改  
            is_right = request.user.check_password(old_pswd)  

            if is_right:  
            print('check3')  
            # 修改密码  
            request.user.set_password(new_pswd)  
            request.user.save()  
            return redirect('/login/')  
    return render(request, 'Auth/set_password.html')

Auth模块注册功能

from django.contrib.auth.models import User  
def register(request):  
    if request.method == 'POST':  
        username = request.POST.get('username')  
        password_raw = request.POST.get('password_raw')  
        password_check = request.POST.get('password_check')  

        if password_raw == password_check:  
            User.objects.create_user(username=username, password=password_raw)  
            return redirect('/login/')  
  
return render(request, 'auth/register.html')

Auth模块的扩展

默认情况下使用的就是Auth_user的默认字段,但是我们也可以扩展自己的字段

前提是:所有的模型类都能继承,扩展之后需要再配置文件中加一句话
在扩展表之前数据库不能迁移,扩展这个表需要再迁移数据库之前。

如果迁移了后,还想扩展怎么办?

1. 换库
2. 需要删除很多个应用的migrations文件夹,auth_migration表里面的迁移记录也需要删除

所以在扩展表之前要想好都需要什么字段

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论