(根据居然老师直播课内容整理)
一、用户基本信息
1、用户基本信息逻辑分析
- 以下是要实现的后端逻辑
- 用户模型补充email_active字段
- 查询并渲染用户基本信息
- 添加邮箱
- 发送邮箱验证邮件
- 验证邮箱
2、用户模型补充email_active字段
- 用户模型中有email字段,但没有邮箱是否激活的字段,需要添加字段
- 对已存在数据有表中,增加字段时,一般需要添加缺省值
email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态')
python manage.py makemigrations
python manage.py migrate
3、查询用户基本信息
- 获取用户中心页面时,查询用户信息,将相关内容做为参数传到前端即可
- UserInfoView.get()方法中,request会带有users信息
# ./apps/users/views.py
context = {
"username": request.user.username,
"mobile": request.user.mobile,
"email": request.user.email,
"email_active": request.user.email_active,
}
return render(request, 'user_center_info.html',context=context)
4、渲染用户基本信息
- 前端显示用户信息时,有3种方法:
- ajax 方式查询获取展示
- django的DTL模板语法方式展示
- vue 方式展示
- 为统一前端实现方式,本项目模板中采用vue方式展示
- 为了保持模板语法一致,将django中模板渲染变量写到js里面,赋值给js变量
- user_center_info.html:
- user_center_info.html
- user_center_info.js
5、添加邮箱信息
5.1 请求方式
选项 |
方案 |
请求方法 |
PUT |
请求地址 |
/email/ |
5.2 请求参数:
参数名 |
类型 |
是否必传 |
说明 |
email |
string |
是 |
{email:邮箱名} |
5.3 响应结果:HTML
字段 |
说明 |
邮箱验证失败 |
响应错误提示 |
邮箱验证成功 |
重定向到用户中心 |
5.4 后端views实现
- 在users.views.py 中定义一个EmailView类,用put方法保存邮箱名称到用户表中
- 接收参数:email
- put方法参数存放在request.body中
- request.body数据是字节类型的,需要decode()转换成字符串
- 再转换成json类型
- 校验邮箱:
- 保存邮箱信息
- 正常情况下,用户登录后才会到达此界面,需要校验是用户是否登录(后面再优化)
- 确认登录后,修改request.user.email属性值并保存,即可完成邮箱信息保存
- 发送激活邮件(后面再优化)
- 返回响应结果
# ./apps/users/views.py
class EmailView(View):
"""添加邮箱"""
def put(self,request):
# 接收参数
# print(request.body) # 建议调试看一下数据及数据类型
json_str = request.body.decode()
# print(type(json_str))
json_dict = json.loads(json_str)
email = json_dict.get('email')
# 校验参数
if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
return http.HttpResponseForbidden('参数邮箱有误')
# 存数据
try:
request.user.email = email
request.user.save()
except Exception as e:
return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '添加邮箱失败'})
# 发送邮件
# 响应结果
return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK'})
5.5 定义路由
# 保存邮件
path('email/', views.EmailView.as_view()),
5.6 前端user_center_info.js
- 点击保存时,执行此js的save_mail函数
- 首选判断邮箱是否正确,
- 如果正确,就提交后台
- 定义url
- 定义put数据传递方式
- 用ajax方式发送请求
- 返回类型是json
6、后端判断用户是否登录
6.1 自定义判断用户是否登录的扩展类:返回JSON
- 获取个人用户中心页面时,写过判断用户是否登录的功能
- UserInfoView类继续 django的LoginRequiredMixin类和view类
- LoginRequiredMixin返回的HttpResponseRedirect
- 而put方法返回的是JsonResponse
- 所以,继承LoginRequiredMixin类,改写返回方法
- 将自定义类存放到./utils/views.py 中
- 重写handle_no_permission方法
# /utils/views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django import http
from utils.response_code import RETCODE
class LoginRequiredJSONMixin(LoginRequiredMixin):
"""自定义判断用户是否登录的扩展类:返回JSON"""
def handle_no_permission(self):
"""直接响应JSON数据"""
return http.JsonResponse({'code': RETCODE.