Django 6中文教程

8.1 Django 内置认证系统

Django 6 内置认证系统教程:核心组件与登录、注销、注册功能实现

Django 6中文教程

本教程详细讲解Django 6内置认证系统的核心组件,包括User模型和认证后端,并提供登录、注销和注册功能的逐步实现指南,适合新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Django 6 内置认证系统详细教程

介绍

Django 是一个高级Python Web框架,它内置了一个强大的认证系统,帮助开发者轻松管理用户身份验证。本教程将深入讲解Django 6中的认证系统,涵盖核心组件和常用功能实现,确保对新人简单易懂。Django 6认证系统基于 django.contrib.auth 模块,提供用户创建、登录、注销等功能,无需额外安装。

1. 认证系统核心组件

1.1 User 模型

在Django中,用户信息由 User 模型表示,它位于 django.contrib.auth.models。默认的 User 模型包含以下常用字段:

  • username: 用户名,唯一标识符。
  • email: 电子邮件地址。
  • password: 加密后的密码。
  • first_namelast_name: 用户姓名。
  • is_active: 布尔值,表示用户是否激活。
  • is_staffis_superuser: 用于管理权限。

Django 6支持自定义用户模型。如果需要扩展用户字段,可以继承 AbstractUserAbstractBaseUser。示例:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True)
    bio = models.TextField(blank=True)

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

AUTH_USER_MODEL = 'myapp.CustomUser'

1.2 认证后端 (Authentication Backend)

认证后端是Django认证系统的核心组件,负责验证用户凭据(如用户名和密码)。默认使用 ModelBackend,它基于 User 模型进行验证。Django允许自定义认证后端,以实现其他认证方式(如OAuth)。

默认后端在 settings.py 中定义:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

自定义认证后端示例:

from django.contrib.auth.backends import BaseBackend
from django.contrib.auth import get_user_model

User = get_user_model()

class CustomBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None
    
    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

2. 登录功能实现

2.1 使用 login() 函数

Django 提供了 login() 函数来处理用户登录。它位于 django.contrib.auth 模块。login() 将用户信息存储在session中,以便后续请求识别用户。

基本视图示例:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import AuthenticationForm

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')  # 重定向到主页
    else:
        form = AuthenticationForm()
    return render(request, 'login.html', {'form': form})

2.2 登录表单

Django内置了 AuthenticationForm 表单,方便处理登录数据。它验证用户名和密码,并调用认证后端。

自定义登录表单示例(可选):

from django import forms

class CustomLoginForm(forms.Form):
    username = forms.CharField(max_length=150)
    password = forms.CharField(widget=forms.PasswordInput)
    
    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        password = cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if user is None:
            raise forms.ValidationError("无效的用户名或密码")
        cleaned_data['user'] = user
        return cleaned_data

模板示例 (login.html):

<!DOCTYPE html>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <h2>登录</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">登录</button>
    </form>
</body>
</html>

3. 注销功能实现

注销功能使用 logout() 函数,它清除session中的用户信息。

视图示例:

from django.shortcuts import redirect
from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    return redirect('login')  # 重定向到登录页面

urls.py 中添加URL:

from django.urls import path
from . import views

urlpatterns = [
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
]

4. 注册功能实现

4.1 用户创建和密码加密

创建新用户时,密码应加密存储。Django 提供 create_user() 方法或手动使用 set_password()

使用 create_user() 示例:

from django.contrib.auth.models import User

# 创建用户并自动加密密码
user = User.objects.create_user(username='john', email='john@example.com', password='securepassword')

使用 set_password() 示例:

from django.contrib.auth.models import User

user = User(username='jane', email='jane@example.com')
user.set_password('securepassword')  # 加密密码
user.save()

4.2 注册表单和视图

创建注册表单,处理用户输入并保存到数据库。

表单示例:

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

class RegistrationForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)
    
    class Meta:
        model = User
        fields = ['username', 'email', 'password']
    
    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get('password')
        confirm_password = cleaned_data.get('confirm_password')
        if password != confirm_password:
            raise forms.ValidationError("密码不匹配")
        return cleaned_data

视图示例:

from django.shortcuts import render, redirect
from .forms import RegistrationForm

def register_view(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.set_password(form.cleaned_data['password'])  # 确保密码加密
            user.save()
            return redirect('login')  # 注册后重定向到登录页面
    else:
        form = RegistrationForm()
    return render(request, 'register.html', {'form': form})

模板示例 (register.html):

<!DOCTYPE html>
<html>
<head>
    <title>注册</title>
</head>
<body>
    <h2>注册新用户</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">注册</button>
    </form>
</body>
</html>

总结

本教程详细介绍了Django 6内置认证系统的核心组件和常用功能实现。通过使用 User 模型、认证后端,以及 login()logout() 函数和注册逻辑,您可以快速构建安全的用户认证系统。建议实践这些示例,并根据项目需求进行定制。Django 6认证系统灵活且易于扩展,适合各种Web应用开发。

如果您遇到问题,参考Django官方文档或社区资源。保持代码简洁,并始终遵循安全最佳实践,如使用HTTPS和定期更新依赖。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包