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

server/2024/11/19 10:41:43/

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/server/143156.html

相关文章

python虚拟环境搭建

python虚拟环境搭建 一、Virtualenv安装二、Virtuanlenv配置 一、Virtualenv安装 python安装virtualenv库并测试   链接:安装库操作 二、Virtuanlenv配置 亲测有效的 更改创建的虚拟环境地址 方法 先修改mkvirtualenv.bat文件中的workon路径 链接:修改…

用 Python 从零开始创建神经网络(七):梯度下降(Gradient Descent)/导数(Derivatives)

梯度下降(Gradient Descent)/导数(Derivatives) 引言1. 参数对输出的影响2. 斜率(The Slope)3. 数值导数(The Numerical Derivative)4. 解析导数(The Analytical Derivat…

【使用 Docker 搭建云原生后端环境的详细教程】

安装 Docker: 对于 CentOS 7/8: 卸载旧版本(如果存在):sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \<

taro框架h5项目打包后页面空白 解决办法

最近正在用taro框架&#xff0c;写一个h5页面&#xff0c;本地打开页面好好的&#xff0c;打包之后页面就一片空白&#xff0c;经过各方搜查&#xff0c;找到了解决办法&#xff0c;以此记录下来&#xff0c;希望可以帮助到和我遇到同样问题朋友们 如果Nginx设置了二层目录&am…

Spring Boot3自定义starter

1、加入必要依赖 plugins {id javaid org.springframework.boot version 3.2.6id io.spring.dependency-management version 1.1.5 } group org.example.test.starter version 1.1.0jar{enabledtrue// resolveMainClassName }java {toolchain {languageVersion JavaLanguage…

开源项目低代码表单设计器FcDesigner扩展自定义组件

开源项目低代码表单设计器FcDesigner中的通过将自定义组件集成到设计器中&#xff0c;您可以添加额外的界面元素和功能&#xff0c;从而增强设计器的适用性和灵活性。以下是详细步骤&#xff0c;以帮助您创建、导入、注册和配置自定义组件。 源码地址: Github | Gitee | 文档 …

CompressAI安装!!!

我就不说废话了&#xff0c;直接给教程&#xff0c;还是非常简单的 但是我看了好多帖子&#xff0c;都没有说明情况 一定要看最后最后的那个注释 正片开始&#xff1a; 一共有三种方式&#xff1a; 第一种就是本机安装&#xff1a; 在网址上下载对应版本Links for compre…

IP数据云 识别和分析tor、proxy等各类型代理

在网络上使用代理&#xff08;tor、proxy、relay等&#xff09;进行访问的目的是为了规避网络的限制、隐藏真实身份或进行其他的不正当行为。 对代理进行识别和分析可以防止恶意攻击、监控和防御僵尸网络和提高防火墙效率等&#xff0c;同时也可以对用户行为进行分析&#xff…