1. 前言
在Web开发中,用户认证是一个不可避免的需求。Django提供了完备的用户认证系统,若应用简单可使用内置的认证系统,若应用复杂可自定义认证系统。本文将以实际示例介绍Django如何实现简单的用户认证。
2. 创建Django项目
首先,我们需要创建一个Django项目作为示例。打开终端,创建一个名为“login_demo”的项目:
django-admin startproject login_demo
然后在项目目录“login_demo”的根目录下创建一个名为“accounts”的应用:
python manage.py startapp accounts
3. 创建用户模型
Django内置的“认证系统”提供了一个名为“User”的模型,我们可以很方便地调用其接口。但是,为了演示如何创建自己的用户模型,我们还是来创建一个自定义的用户模型。
在应用“accounts”下的models.py文件中添加如下代码:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('Users must have a valid email address')
user = self.model(email=self.normalize_email(email), **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True')
return self.create_user(email, password, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
objects = UserManager()
USERNAME_FIELD = 'email'
其中,UserManager提供了创建用户和创建超级用户的方法;User模型继承了Django的AbstractBaseUser和PermissionsMixin,并声明相关的属性,包括邮箱、姓和名、是否为管理员和是否激活等,同时使用上述提到的UserManager来操作数据库。
4. 创建表单
接下来,我们需要为用户提供认证表单。创建一个名为“LoginForm”的表单,放在“accounts/forms.py”文件中:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.utils.translation import ugettext_lazy as _
from .models import User
class LoginForm(forms.Form):
email = forms.EmailField(label=_("Email Address"))
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
class Meta:
model = User
在该表单中,我们引用了Django自带的UserCreationForm,以及上述自定义的User模型。
5. 创建视图函数
在应用“accounts”下的views.py文件中添加如下代码:
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import LoginForm
def user_login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
user = authenticate(request, email=email, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
form = LoginForm()
return render(request, 'accounts/login.html', {'form': form})
该视图函数先判断用户请求的方法是否为POST,若为POST则验证表单的有效性,通过authenticate()方法验证用户邮箱和密码是否匹配,若验证通过则调用login()函数登录并重定向到主页,否则仍停留在登录页面;若是GET方法则直接渲染登录页面,并传入“form”作为上下文。
6. 创建模板
最后一步是创建模板。在应用“accounts”下新建一个名为“login.html”的文件,添加如下代码:
{% extends 'base.html' %}
{% block content %}
Login
{% if form.errors %}
Your username and password didn't match. Please try again.
{% endif %}
{% endblock %}
在该模板中,我们继承了基础模板,并创建了一个表单,其中使用form.as_p作为表单的渲染方法。
7. 小结
本文介绍了如何使用Django创建一个简单的用户认证系统。在该示例中,我们创建了自己的用户模型,以及登录表单和视图函数。当用户通过表单提交,视图函数会验证用户的登录凭证,并登录并重定向到主页。