Django | 高级之 Auth模块

Auth模块是什么

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

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

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

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

python3.10 manage.py createsuperuser

terminal 复制代码
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模块的登录功能

python 复制代码
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模块的登录验证功能

python 复制代码
# 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模块的退出登录登录

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

Auth模块的修改密码功能

python 复制代码
# 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模块注册功能

python 复制代码
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的默认字段,但是我们也可以扩展自己的字段

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

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

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

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

相关推荐
失败尽常态5231 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447741 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农1 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿1 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Leuanghing2 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
2501_904447742 小时前
华为发力中端,上半年nova14下半年nova15,大力普及原生鸿蒙
华为·智能手机·django·scikit-learn·pygame
xinxiyinhe3 小时前
如何设置Cursor中.cursorrules文件
人工智能·python
诸神缄默不语3 小时前
如何用Python 3自动打开exe程序
python·os·subprocess·python 3
橘子师兄4 小时前
分页功能组件开发
数据库·python·django
Logintern094 小时前
使用VS Code进行Python编程的一些快捷方式
开发语言·python