django快速实现注册登陆忘记密码功能

要快速实现注册、登录和忘记密码功能,可以使用Django自带的认证模块(django.contrib.auth)。

以下是实现步骤:

  1. 创建Django项目和应用程序

在终端中使用以下命令创建Django项目和应用程序:

django-admin startproject myproject
python manage.py startapp myapp
  1. 配置数据库

在myproject/settings.py文件中配置数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
  1. 创建用户模型

在myapp/models.py文件中定义用户模型:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

然后在myproject/settings.py文件中添加AUTH_USER_MODEL配置项:

AUTH_USER_MODEL = 'myapp.User'
  1. 创建视图函数

在myapp/views.py文件中定义视图函数:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordResetForm
from django.contrib.auth.views import PasswordResetConfirmView, PasswordResetCompleteView

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password1')
            user = authenticate(request, username=username, password=password)
            login(request, user)
            return redirect('home')
    else:
        form = UserCreationForm()
    return render(request, 'signup.html', {'form': form})

def signin(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, 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)
            login(request, user)
            return redirect('home')
    else:
        form = AuthenticationForm()
    return render(request, 'signin.html', {'form': form})

def signout(request):
    logout(request)
    return redirect('home')

def password_reset(request):
    if request.method == 'POST':
        form = PasswordResetForm(request.POST)
        if form.is_valid():
            form.save(email_template_name='password_reset_email.txt')
            return redirect('password_reset_done')
    else:
        form = PasswordResetForm()
    return render(request, 'password_reset.html', {'form': form})

class PasswordResetConfirmViewCustom(PasswordResetConfirmView):
    template_name = 'password_reset_confirm.html'

class PasswordResetCompleteViewCustom(PasswordResetCompleteView):
    template_name = 'password_reset_complete.html'

这里我们定义了四个视图函数:

  • signup:处理注册请求,使用UserCreationForm表单创建新用户,并自动登录。
  • signin:处理登录请求,使用AuthenticationForm表单认证用户,并自动登录。
  • signout:处理退出登录请求,注销当前用户并重定向到主页。
  • password_reset:处理忘记密码请求,使用PasswordResetForm表单生成密码重置邮件,并发送到用户的注册邮箱。

还定义了两个类视图:

  • PasswordResetConfirmViewCustom:重置密码确认视图。
  • PasswordResetCompleteViewCustom:密码重置完成视图。

这里使用了Django自带的表单(UserCreationForm、AuthenticationForm和PasswordResetForm)来简化代码。

  1. 创建URL路由

在myapp/urls.py文件中定义URL路由:

from django.urls import path
from .views import *

urlpatterns = [
    path('signup/', signup, name='signup'),
    path('signin/', signin, name='signin'),
    path('signout/', signout, name='signout'),
    path('password_reset/', password_reset, name='password_reset'),
    path('password_reset/<uidb64>/<token>/', PasswordResetConfirmViewCustom.as_view(), name='password_reset_confirm'),
    path('password_reset/done/', PasswordResetCompleteViewCustom.as_view(), name='password_reset_complete'),
]
  1. 创建模板文件

在myapp/templates目录下创建如下模板文件:

  • base.html:包含所有页面共享的HTML代码。
  • home.html:主页模板,显示已登录用户的用户名,提供注册、登录、忘记密码和退出登录功能。
  • signup.html:注册页面模板,包含UserCreationForm表单。
  • signin.html:登录页面模板,包含AuthenticationForm表单。
  • password_reset.html:忘记密码页面模板,包含PasswordResetForm表单。
  • password_reset_email.txt:密码重置邮件模板,使用Django内置的模板语言格式化邮件内容。
  • password_reset_confirm.html:密码重置确认页面模板,继承自Django自带视图PasswordResetConfirmView,并自定义一些HTML代码。
  • password_reset_complete.html:密码重置完成页面模板,继承自Django自带视图PasswordResetCompleteView,并自定义一些HTML代码。

  • 运行测试

运行Django开发服务器,使用浏览器访问主页,尝试注册、登录和忘记密码功能。如果一切正常,则可以在用户数据库中看到新注册的用户,并且能够通过邮件重置密码。

评论 0