当前位置: 首页 > article >正文

django auth模块帮你实现完整的用户体系

前言

在开发一个网站的时候不可避免的需要实现网站的用户系统,包括用户注册、用户登录、用户认证、用户注销等功能,自己写起来就很麻烦,django作为一个完美主义者的终极框架,肯定也考虑到这些问题了,django解决这些问题的方式就是强大的内置用户认证系统-auth,本文就来详细介绍一下django的auth认证功能。

auth模块简介

django提供了一个非常好用的组件,这个组件主要负责用户登录认证的全套功能,它就是auth组件。有了auth组件,我们就不需要再手动写登录校验装饰器,不需要再手动设置session保存用户状态。django项目执行数据库迁移命令后会生成一堆默认的表,其中就包括auth_user表,auth组件和这张表有密切关系。另外,django项目默认都会有一个admin后台管理系统,登录的用户信息是保存在auth_user表中的;且用户分为普通用户和超级用户,只有超级用户可以登录admin后台管理系统。

python manage.py createsuperuser
# 邮箱可以不写,密码长度最短8位,创建完成之后就可以登录django后台管理了。

auth模块的基本使用

登陆校验:auth.authenticate()

from django.contrib import auth

user_obj = auth.authenticate(request,
                             username=username,
                             password=password)

print(user_obj) 
print(user_obj.username)

# 注意点:
    1.authenticate()括号内必须同时传入用户名和密码
    2.密码自动加密校验
    3.校验成功,返回当前对象,校验失败返回None

保存用户状态:auth.login()

auth.login(request, user_obj)  
request.user  # 获取当前登录的用户对象
# 注意点:
    1.该方法需要request、和当前登陆用户对象俩个方法
    2.该方法自动设置session,类似于request.session[key] = user_obj
    3.只要执行了该方法后,就可以在任何地方通过request.user获取到当前登陆的用户对象

登录装饰器:判断用户是否登录

from django.contrib.auth.decorators import login_required


@login_required(login_url='/login/') 
def index(request):
    pass

# 注意点:
    1.未登录时跳转到的页面需要手动设置;设置分局部设置和全局设置。
    2.局部设置,直接在装饰器内通过参数login_url指定
    3.全局设置,在配置文件中通过参数LOGIN_URL = '/login/'设置
    4.装饰器帮我们在跳转后的url后面添加了target_url,我们在login的视图函数中手动捕获它
    4.局部设置的优先级高与全局的设置
    5.全局的好处在于无需重复写代码 但是跳转的页面却很单一
    6.局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面

用户修改密码如何进行校验

- 如何进行原密码的比对
request.user.check_password(old_password)
- 修改用户信息
request.user.set_password(new_password)  # 仅仅是在修改对象的属性
request.user.save()  # 这一步才是真正的操作数据库

如何注销当前用户:auth.logout(request)

用户如何进行注册

# 方式1:操作auth_user表写入数据(不推荐,密码没有加密处理)
from django.contrib.auth.models import User
User.objects.create(username=username, password=password) 


# 方式2:创建普通用户
User.objects.create_user(username=username, password=password)


# 方式3:创建超级用户
User.objects.create_superuser(username=username,
                              email='123@qq.com',
                              password=password)

#注意:
	1.方式2和方式3创建成功后返回当前对象
	2.使用代码创建超级用户,邮箱是必填的,而用命令创建则可以不填

扩展auth_user表

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

比如,我想要加一个存储用户手机号的字段,怎么办?

聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?答案是当然有了。

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了.

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

如果继承了AbstractUser类,那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了,而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段,这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展。

但是使用这种方式的前提有以下几个:

1.在继承之前没有执行过数据库迁移命令
auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
2.继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
3.需要在配置文件中告诉django你要用UserInfo替代auth_user
AUTH_USER_MODEL = 'app01.UserInfo' # '应用名.表名'
4.如果自己写表替代了auth_user那么auth模块的功能还是照常使用,参考的表页由原来的auth_user变成了UserInfo


http://www.kler.cn/a/16357.html

相关文章:

  • sql专题 之 where和join on
  • Unity安装后点击登录没反应
  • 探索 HTML 和 CSS 实现的蜡烛火焰
  • 【OpenEuler】配置虚拟ip
  • Tomcat 和 Netty 的区别及应用场景分析
  • Linux源码阅读笔记-V4L2框架基础介绍
  • 基于电流控制的并网逆变器(Simulink)
  • 分布式链路追踪之SkyWalking
  • 瑞吉外卖管理端具体代码
  • MultiBox:Scalable Object Detection using Deep Neural Networks(论文Google翻译纯享)
  • 2022年职业教育技能大赛网络安全 linux系统渗透提权
  • 【C++技能树】类的六个成员函数Ⅰ --构造、析构、拷贝构造函数
  • 详解MySQL索引
  • 项目实战笔记
  • 解决wordpress 没有“add new“按钮
  • 一以贯之:从城市网络到“城市一张网”
  • LeetCode 1003. 检查替换后的词是否有效
  • ChatGPT- 开始使用 ChatGPT 并访问 OpenAI 获取 API Keys
  • 介绍tcpdump在centos中的使用方法
  • c++ 11标准模板(STL) std::vector (四)
  • Node服务端开发【NPM】
  • USB转串口芯片CH9101U
  • 当一个测试人员说他“测完了”,里面的坑是什么?
  • [创新工具和方法论]-02- DOE实验设计步骤
  • Adobe Photoshop 软件下载
  • 网络基础:socket套接字