Django实现简单登录的示例代码

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 %}

{% csrf_token %}

{{ form.as_p }}

{% endblock %}

在该模板中,我们继承了基础模板,并创建了一个表单,其中使用form.as_p作为表单的渲染方法。

7. 小结

本文介绍了如何使用Django创建一个简单的用户认证系统。在该示例中,我们创建了自己的用户模型,以及登录表单和视图函数。当用户通过表单提交,视图函数会验证用户的登录凭证,并登录并重定向到主页。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。撸码网站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签