django快速实现注册登陆忘记密码功能
要快速实现注册、登录和忘记密码功能,可以使用Django自带的认证模块(django.contrib.auth)。
以下是实现步骤:
- 创建Django项目和应用程序
在终端中使用以下命令创建Django项目和应用程序:
django-admin startproject myproject
python manage.py startapp myapp
- 配置数据库
在myproject/settings.py文件中配置数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '3306',
}
}
- 创建用户模型
在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'
- 创建视图函数
在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)来简化代码。
- 创建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'),
]
- 创建模板文件
在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