auth认证模块

Auth模块是什么

Auth模块是Django自带的用户认证模块:

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

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

Auth模块使用

当数据库进行迁移命令后,就会自动创建出auth_user表。

  • 创建管理员账号
python manage.py createsuperuser
# 之后会要求输入用户名与密码,输入完成后即可创建完成

创建完成之后,就可以使用这个用户登录admin/路由了。

基于Auth模块编写用户登录功能

说明:
auth模块可以帮你做什么呢?

  1. 登录
  2. 校验用户信息
  3. 修改密码
  4. 注销登录
  5. 等等等等....

下面试着创建注册功能:
需要注意的几点:

  1. 当models.py中没有定义表时,如何操作auth_user表
from django.contrip.auth.models import User
User.objects.filter(username='xxxxx')
  1. 不能使用下面User.objects.create操作创建用户,因为不会对密码进行加密
from django.contrip.auth.models import User
from django.contrip import auth
# 不可以这样创建,否则密码不会加密,后期使用auth调用时会调用不到
User.objects.create(username='xxx', password='xxx')
# 需要使用create_user进行创建
User.objects.create_user(username='xxx', password='xxx')

注册功能代码

from django.contrib import auth
from django.contrib.auth.models import User


def register_func(request):
    if request.method == 'POST':
        # 获取前端用户名密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 校验用户名是否在数据库中
        db_username = User.objects.filter(username=username)
        # 如果用户名存在,则报错
        if db_username:
            return HttpResponse('用户名已存在')
        # 如果用户不存在,则写入数据库并重定向到登录页面
        else:
            User.objects.create_user(username=username, password=password)
            return redirect('/login/')
    return render(request, 'register.html')

登录功能代码

def login_func(request):
    if request.method == 'POST':
        # 获取用户输入的用户名与密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 使用用户输入的用户名与密码去数据库中进行校验
        user_obj = auth.authenticate(username=username, password=password)  # 返回值是一个数据对象,不是一个字符串
        if user_obj:
            # 用户登录成功,记录session/cookie
            auth.login(request, user_obj)  # 自动操作django的session表
            return HttpResponse('登录成功')
    return render(request, 'login.html')

校验用户是否登录

request.user对象
当用户未登录时,对象返回值为:AnonymousUser
当用户已登录时,对象返回值为:登录的用户名
request.user.is_authenticated对象
判断当前用户对象是否已登录
当用户未登录时,对象返回值为:False
当用户已登录时,对象返回值为: True

用户登录返回页面不同

使用场景:当用户登录,页面返回用户名;当用户未登录,页面显示“注册、登录”两个按钮

# 视图层
def home_func(request):
    return render(request, 'home.html', locals())   # 将request返回给前端

# 模板层
# 如果是登录的用户,这里就是True,就会返回用户名
{% if request.user.is_authenticated %}
    <p>{{ request.user.username }}</p>
# 否则是未登录的用户,这里就是False,就会返回登录注册
{% else %}
    <a href="">登录</a>
    <a href="">注册</a>
{% endif %}

判断用户是否登录

使用场景:用户未登录,跳转到登录页面,用户已登录,则放行

# 1. 导入模块
from django.contrib.auth.decorators import login_required

# 2. 对应代码
@login_required(login_url='/login/')  # 如果不指定login_url,会跳转到django的LOGIN_URL自动配置的一个路由
def index_func(request):
    return HttpResponse('用户已登录,可以访问index')

# 3. 修改LOGIN_URL全局变量
# 修改settings.py文件,在最后添加
LOGIN_URL = '/login/'
@login_required  # 此时,就会按照LOGIN_URL变量进行跳转了,就不需要指定login_url了
def index_func(request):
    return HttpResponse('用户已登录,可以访问index')

用户修改密码

  • 使用到的方法
request.user.check_password(old_pwd)  校验密码是否正确
request.user.set_password(new_pwd)    设置密码
request.user.save()  保存修改,修改完后必须保存
  • 代码
from django.contrib.auth.decorators import login_required

@login_required
def set_pwd_func(request):
    if request.method == 'POST':
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        confirm_pwd = request.POST.get('confirm_pwd')
        if not new_pwd == confirm_pwd:
            return HttpResponse('两次密码不一致')
        # 判断原密码是否正确
        is_true = request.user.check_password(old_pwd)
        if not is_true:
            return HttpResponse('原密码输入错误')
        # 修改密码
        request.user.set_password(new_pwd)
        request.user.save()  # 一定要保存,否则不会写入到数据库
        return HttpResponse('密码修改成功')
    return render(request, 'setPwd.html')

用户退出登录

所谓的退出登录,就是把用户手中代表cookie的信息删除即可,或删除session表中对应的数据

@login_required
def logout_func(request):
    auth.logout(request)  # 只需要这一个模块即可
    return HttpResponse('退出成功')

扩展auth_user表

  • 方法一:使用一对一外键字段关联,比较繁琐
  • 方法二:直接替换auth_user表
# 替换auth_user表的方法,注意原来如果做过数据库迁移,生成过auth_user表是不行的,必须没有auth_user表
# 1. 模型层编写模型继承
# 先导入模块
from django.contrib.auth.models import AbstractUser

# 再定义表
class UserInfo(AbstractUser):
    # 填写AbstractUser表中没有的字段
    phone = models.CharField(max_length=11)
    desc = models.CharField(max_length=64)

# 2. 在settings.py配置文件中声名替换关系
AUTH_USER_MODEL = 'app01.UserInfo'

# 3. 数据库迁移
posted @   树苗叶子  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示