准备工作
1、配置settings.py内置文件
注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常
2、创建应用
3、配置主路由
一、用户注册
1、创建用户注册model模型
1)设置模型抽象类
2)进入user应用设置model
这里使用的是django内部AbstractUser用户类
2、显示用户注册页面
方法一:使用FBV请求处理
FBV:(function base views) 就是在视图里使用函数处理请求。
1)定义路由
import . import views url(r\'^register$\', views.register, name=\'register\')
2)定义注册的视图函数
import re
from django.shortcuts import render, redirect
from .models import User
from django.core.urlresolvers import reverse
def register(request):
\'\'\'显示注册页面\'\'\'
if request.method == \'GET\':
return render(request, \'register.html\')
else:
username = request.POST.get(\'user_name\')
password = request.POST.get(\'pwd\')
email = request.POST.get(\'email\')
allow = request.POST.get(\'allow\')
# 进行数据校验
if not all([username, password, email]):
# 数据不完整
return render(request, \'register.html\', {\'errmsg\': \'数据不完整\'})
# 邮箱校验
if not re.match(r\'^[a-z0-9][\w\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$\', email):
return render(request, \'register.html\', {\'errmsg\': \'邮箱格式不正确\'})
# 天天生鲜协议校验
if allow != \'on\':
return render(request, \'register.html\', {\'errmsg\': \'请同意协议\'})
# 校验用户名是否重复
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# 用户名不存在
user = None
if user:
# 用户名以存在
return render(request, \'register.html\', {\'errmsg\': \'用户名已存在\'})
# 进行业务处理:用户注册
user = User.objects.create_user(username, email, password)
user.is_active = 0
user.save()
# 返回应答,跳转到首页
return redirect(reverse(\'goods:index\'))
方法二:使用CBV请求处理(推荐)
CBV(class base views) 就是在视图里使用类处理请求。
1)定义路由
url(r\'^register$\', RegisterView.as_view(), name=\'register\'), # 注册
2)定义注册视图类
import re
from django.shortcuts import render, redirect
from .models import User
from django.core.urlresolvers import reverse
from django.views.generic import View
from django.conf import settings
from django.http import HttpResponse
class RegisterView(View):
"""注册"""
def get(self, request):
"""显示注册页面"""
return render(request, \'register.html\')
def post(self, request):
"""进行注册处理"""
# 接收数据
username = request.POST.get(\'user_name\')
password = request.POST.get(\'pwd\')
email = request.POST.get(\'email\')
allow = request.POST.get(\'allow\')
# 进行数据校验
if not all([username, password, email]):
# 数据不完整
return render(request, \'register.html\', {\'errmsg\': \'数据不完整\'})
# 邮箱校验
if not re.match(r\'^[a-z0-9][\w\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$\', email):
return render(request, \'register.html\', {\'errmsg\': \'邮箱格式不正确\'})
# 天天生鲜协议校验
if allow != \'on\':
return render(request, \'register.html\', {\'errmsg\': \'请同意协议\'})
# 校验用户名是否重复
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# 用户名不存在
user = None
if user:
# 用户名以存在
return render(request, \'register.html\', {\'errmsg\': \'用户名已存在\'})
# 进行业务处理:用户注册
user = User.objects.create_user(username, email, password)
user.is_active = 0
user.save()
# 返回应答,跳转到首页
return redirect(reverse(\'goods:index\'))
3)激活邮箱
1)下载加密签名数据包
2)设置路由,编写代码逻辑
class ActiveView(View):
"""用户激活"""
def get(self, request, token):
"""进行用户激活"""
# 进行解密 获取要激活的用户信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
info = serializer.loads(token)
# 获取待激活用户的id
user_id = info[\'confirm\']
# 根据id获取用户信息
user = User.objects.get(id=user_id)
user.is_active = 1
user.save()
# 跳转到登录页面
return redirect(reverse(\'user:login\'))
except SignatureExpired as e:
# 激活链接已过期
return HttpResponse(\'激活链接已过期\')
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, SignatureExpired from django.core.mail import send_mail # 发送激活邮件 包含激活链接:Http://127.0.0.1:8000/user/active/3 # 激活链接中需要包含用户的身份信息 并且要把身份信息进行加密 # 加密用户的身份信息 生成激活token class Register(View):
...
serializer = Serializer(settings.SECRET_KEY, 3600) info = {\'confirm\': user.id} token = serializer.dumps(info) token = token.decode(\'utf-8\')
4)发送邮箱
流程:Django网站--->smtp服务器--->目的邮箱
配置settings.py
class Register(View):
...
# 发邮箱 subject = \'天天生鲜欢迎信息\' message = \'邮件正文\' sender = settings.EMAIL_FROM receiver = [email] html_message = f\'<h1>{username},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户\' \ f\'<a href="http://127.0.0.1:8000/user/active/{token}">http://127.0.0.1:8000/user/active/{token}</a>\' send_mail(subject, message, sender, receiver, html_message=html_message)