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

devtools/2024/11/19 21:19:30/

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.ppmy.cn/devtools/135298.html

相关文章

计算机网络之表示层

一、定义与概述 在计算机网络中,OSI(Open Systems Interconnection)模型是一种广泛接受的分层模型,用于描述网络通信的各个方面。这个模型将网络通信划分为七个不同的层次,每一层都负责特定的任务,以确保数…

一文理解:结构化数据、非结构化数据、半结构化数据和元数据

一文理解:结构化数据、非结构化数据、半结构化数据和元数据 1. 结构化信息 (Structured Data)2. 非结构化信息 (Unstructured Data)3. 半结构化信息 (Semi-structured Data)4. 元数据 (Metadata)5. 结构化信息、非结构化信息、半结构化信息和元数据之间的关系总结 1…

ArcGIS Pro的arpx项目在ArcGIS Server中发布要素服务(FeatureServer)

写在前面 前一段时间做ArcGIS 的javascript开发,对arcgis的服务概念比较混乱,只记得当时使用arcgis pro直接发布要素服务,然后基于javascript开发就够了,但是arcgis pro是portal托管服务,你不需要自己的arcgis server…

Centos安装Elasticsearch教程

网上相关的安装教程有很多,基本是官网下载、解压、启动完事了,本文主要记录个人在实际安装过程终于到的问题,如果你刚好也刷到了这篇文档,希望对你有所帮助。 操作系统版本:Centos7Elasticsearch版本:7.9.3…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch (1)springboot和Elasticsearch的版本对应关系如下,请看版本对应: 注意安装对应版本,否则可能会出现一些未知的错误。 (2)拉取镜像 docker pull elasticsearch:7…

计算机网络基础——针对实习面试

目录 计算机网络基础OSI七层模型TCP/IP四层模型为什么网络要分层?常见网络协议 计算机网络基础 OSI七层模型 开放系统互连参考模型(Open Systems Interconnection Reference Model,简称OSI模型)是一个概念性模型,用于…

Prompt设计技巧和高级PE

目录 PD and PE:INTRODUCTION AND ADVANCED METHODS 1.Instructions 2.Basic Knowledge - Prompt 2.1 Prompt 2.2 Prompt Cases 2.3 Prompt Engineering 3. LLM 的局限 4. Prompt 设计技巧和方法 4.1 Chain of thought prompting 4.2 Encouraging the model to be fa…

鸿蒙next版开发:使用HiDebug获取调试信息(ArkTS)

在HarmonyOS 5.0中,HiDebug是一个提供应用调试功能的工具,它可以帮助开发者获取系统的CPU使用率、内存信息等关键性能数据。这对于性能分析和问题诊断至关重要。本文将详细介绍如何在ArkTS中使用HiDebug获取调试信息,并提供示例代码进行说明。…