django从入门到精通(六)——auth认证及自定义用户

Django 提供了一个强大的用户认证系统,允许开发者轻松管理用户的注册、登录、权限和组等功能。以下是对 Django 用户认证系统的详细介绍,包括默认的用户认证、自定义用户认证和权限设置。

1. 默认用户认证

1.1 用户模型

Django 默认提供了一个用户模型 User,位于 django.contrib.auth.models 模块中。该模型包含以下字段:

  • username: 用户名,唯一。
  • password: 密码,经过哈希处理。
  • email: 电子邮件地址。
  • first_name: 名字。
  • last_name: 姓氏。
  • is_active: 布尔值,指示用户是否活跃。
  • is_staff: 布尔值,指示用户是否可以登录到管理后台。
  • is_superuser: 布尔值,指示用户是否为超级用户。
  • last_login: 用户最后登录时间。
  • date_joined: 用户注册时间。

1.2 用户注册

您可以使用 Django 表单来处理用户注册。以下是一个简单的用户注册视图示例:

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationFormdef register(request):if request.method == 'POST':form = UserCreationForm(request.POST)if form.is_valid():form.save()  # 保存用户return redirect('login')  # 注册后重定向到登录页面else:form = UserCreationForm()return render(request, 'register.html', {'form': form})

1.3 用户登录

Django 提供了内置的登录视图,您可以使用 LoginView 来处理用户登录。

示例

from django.contrib.auth.views import LoginViewclass CustomLoginView(LoginView):template_name = 'login.html'  # 自定义登录模板

urls.py 中配置 URL:

from django.urls import path
from .views import CustomLoginViewurlpatterns = [path('login/', CustomLoginView.as_view(), name='login'),
]

1.4 用户登出

Django 也提供了内置的登出视图,您可以使用 LogoutView 来处理用户登出。

示例

from django.contrib.auth.views import LogoutViewurlpatterns = [path('logout/', LogoutView.as_view(), name='logout'),
]

1.5 用户认证

您可以使用 authenticate()login() 函数来手动处理用户认证。

from django.contrib.auth import authenticate, logindef user_login(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']user = authenticate(request, username=username, password=password)if user is not None:login(request, user)  # 登录用户return redirect('home')else:# 返回错误信息...

2. 自定义用户认证

如果您需要更复杂的用户模型,可以通过扩展 AbstractUserAbstractBaseUser 来创建自定义用户模型。

2.1 使用 AbstractUser

通过继承 AbstractUser,您可以添加额外的字段。

from django.contrib.auth.models import AbstractUser
from django.db import modelsclass CustomUser(AbstractUser):phone_number = models.CharField(max_length=15, blank=True, null=True)

settings.py 中指定自定义用户模型:

AUTH_USER_MODEL = 'yourapp.CustomUser'

2.2 使用 AbstractBaseUser

如果您需要完全控制用户模型,可以继承 AbstractBaseUser

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import modelsclass CustomUserManager(BaseUserManager):def create_user(self, email, password=None, **extra_fields):if not email:raise ValueError('The Email field must be set')email = self.normalize_email(email)user = self.model(email=email, **extra_fields)user.set_password(password)user.save(using=self._db)return userdef create_superuser(self, email, password=None, **extra_fields):extra_fields.setdefault('is_staff', True)extra_fields.setdefault('is_superuser', True)return self.create_user(email, password, **extra_fields)class CustomUser(AbstractBaseUser):email = models.EmailField(unique=True)first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=30)is_active = models.BooleanField(default=True)is_staff = models.BooleanField(default=False)objects = CustomUserManager()USERNAME_FIELD = 'email'REQUIRED_FIELDS = ['first_name', 'last_name']

2.3 创建和迁移自定义用户模型

在定义自定义用户模型后,您需要创建和应用迁移:

python manage.py makemigrations
python manage.py migrate

3. 权限设置

Django 的用户认证系统还提供了权限管理功能。每个用户可以被分配不同的权限。

3.1 权限模型

Django 默认提供了三种权限:

  • add: 添加对象的权限。
  • change: 修改对象的权限。
  • delete: 删除对象的权限。

您可以在模型中自定义权限:

class Blog(models.Model):title = models.CharField(max_length=200)content = models.TextField()class Meta:permissions = [('can_publish', 'Can Publish Blog'),]

3.2 检查权限

您可以使用 user.has_perm() 方法检查用户是否具有特定权限。

if request.user.has_perm('yourapp.can_publish'):# 用户有发布权限...

3.3 组管理

Django 允许将用户分组,以便于管理权限。您可以创建组并为组分配权限。

from django.contrib.auth.models import Group# 创建组
group, created = Group.objects.get_or_create(name='Editors')# 添加权限
group.permissions.add(permission)# 将用户添加到组
user.groups.add(group)

4. 总结

  • 默认用户认证:Django 提供了内置的用户模型和认证视图,支持用户注册、登录和登出。
  • 自定义用户认证:可以通过继承 AbstractUserAbstractBaseUser 创建自定义用户模型。
  • 权限设置:Django 提供了权限管理功能,允许为用户和组分配权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis/Codis性能瓶颈揭秘:网卡软中断的影响与优化

目录 现象回顾 问题剖析 现场分析 解决方案 总结与反思 1.调整中断亲和性(IRQ Affinity): 2.RPS(Receive Packet Steering)和 RFS(Receive Flow Steering): 近期,…

WordPress设置自动更新CSS版本号

WordPress 通常会在引用 CSS 文件时添加版本号参数(?verx.x.x)。如果版本号未更新,浏览器可能继续加载旧的文件。 解决方法:确保你在 functions.php 文件中正确加载了 CSS 文件,并动态更新版本号。例如在functions.p…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验,这里想写一下我配置机器学习的anaconda环境的二三事 一、首先,下载安装包: Download Now | Anaconda 二、打开安装包,一直点NEXT进行安装 这里要记住你要下载安装的路径在哪,后续配置环境…

OceanBase 升级过程研究(4.2.1.6-4.2.1.8)

模拟业务 使用benchmark加载10仓数据模拟业务场景 升级方法 使用滚动升级方式来进行OB升级。该方法前提是OB集群必须满足官方规定的高可用架构(如果 Zone 个数小于 3,滚动升级时则无法构成多数派), 滚动升级的原理就是轮流完成每个ZONE的升级工作,由于…

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…

C#.Net筑基-字符串超全总结

字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性、驻留性,很容易产生性能问题,因此必须全面了解一下。 01、字符与字符编码 1.1、字符Char 字符 char 表示为 Unicode字符,在C#中用 UTF-16 …

苍穹外卖-后端部分

软件开发整体介绍 前端搭建 在非中文目录中双击nginx.exe然后浏览器访问localhost即可 后端搭建 基础准备 导入初始文件 使用git进行版本控制 创建本地仓库和远程仓库,提交Git 连接数据库 连接数据库把资料中的文件放入运行即可 前后端联调测试 苍穹外卖项目接口文档…

剧本杀门店预约小程序,解锁沉浸式推理体验

一、开发背景 剧本杀作为一种热门娱乐游戏,深受大众的欢迎,但随着市场的快速发展,竞争也在不断加大,对于剧本杀线下商家来说面临着发展创新。 剧本杀线下门店数量目前正在逐渐增加,竞争激烈,而门店的获客…

【WPF】Prism学习(二)

Prism Commands 1.命令(Commanding) 1.1. ViewModel的作用: ViewModel不仅提供在视图中显示或编辑的数据,还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面(UI)执行的动作或操作…

学者观察 | 元计算、人工智能和Web 3.0——山东大学教授成秀珍

导语 成秀珍教授提出元计算是在开放的零信任环境下整合算力资源打通数据壁垒构建自进化智能的新质生产力技术,是一种新计算范式;区块链是Web3.0的核心技术之一,有助于保障开放零信任环境下,用户、设备和服务间去中心化数据流通的…

学习笔记022——Ubuntu 安装 MySQL8.0版本踩坑记录

目录 1、查看可安装 MySQL 版本 2、Ubuntu安装 MySQL8.0 3、MySQL8.0 区分大小写问题 4、MySQL8.0 设置sql_mode 5、MySQL8.0 改端口33060(个人遇到问题) 1、查看可安装 MySQL 版本 ## 列出可用的MySQL版本(列出所有可用的MySQL版本以…

「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024

在人工智能和开源技术蓬勃发展的当下,AI Infra 项目正经历着日新月异的变革。从跨平台运行时到云边端 AI 基础设施,再到多模态知识助手,创新浪潮席卷而来。这些进步不仅显著提升了技术指标,也为实时音视频处理、边缘计算、大模型应…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果: – 使用Pygame模拟粒子运动,粒子会以爱心的轨迹分布并运动。爱心公式: 爱心的数学公式: x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果: 粒子…

免费实时图片编辑工具:MagicQuill

参看: https://huggingface.co/spaces/AI4Editing/MagicQuill 人工智能交互式图像编辑:可以制定涂改增加删除

web——upload-labs——第九关——特殊字符::$DATA绕过

特殊字符::$DATA绕过 典型绕过场景 在一些系统中,::$DATA 被用于绕过文件路径的限制。比如: 路径过滤绕过:如果系统有某种机制来检查和限制文件路径(例如,禁止访问某些系统目录或敏感文件),通…

本地部署 excalidraw

本地部署 excalidraw 0. 引言1. 本地部署 excalidraw2. 访问 excalidraw 0. 引言 Excalidraw 编辑器是一款开源虚拟手绘白板,支持协作且端到端加密。 1. 本地部署 excalidraw git clone https://github.com/excalidraw/excalidraw.git; cd excalidrawvi docker-c…

《Java核心技术 卷I》用户界面AWT事件继承层次

AWT事件继承层次 EventObject类有一个子类AWTEvent,它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象,都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件:表示用户的动作事件&…

三周精通FastAPI:42 手动运行服务器 - Uvicorn Gunicorn with Uvicorn

官方文档:Server Workers - Gunicorn with Uvicorn - FastAPI 使用 fastapi 运行命令 可以直接使用fastapi run命令来启动FastAPI应用: fastapi run main.py如创建openapi.py文件: from fastapi import FastAPIapp FastAPI(openapi_url&…

整理iPhone空间:iphone怎么删除相簿

随着时间的积累,我们的iPhone中不仅会堆积大量照片,还可能会有多个不再需要的相簿。这些相簿不仅占用存储空间,还可能使相册应用变得杂乱无章。本文将探讨iphone怎么删除相簿,并介绍精简iPhone相册的技巧,使你的相册管…