黑马Python教程实战项目--美多商城(五)

2023-11-02

一.用户基本信息
  首先需要为用户模型类,也就是用户数据表,补充一个邮箱验证状态字段,用来记录用户的邮箱是否验证成功。然后新建用户中心视图类,继承LoginRequiredMixin和View类,在子路由中添加路由。定义get方法,在request中获取登陆的用户对象,构造响应体,将用户的基本信息渲染在用户中心html文件,并响应给前端。
二.添加和验证邮箱
  当用户在用户中心页点击了添加邮箱时,前端会发送一个ajax的put请求,并携带一个邮箱参数。在user子应用中的views文件里,定义一个添加邮箱视图类,在子路由中添加路由,定义put方法。然后接受参数,校验邮箱地址是否合法。不合法就中断请求,返回错误信息,合法就将邮箱保存进数据库中,并响应结果。
  因为添加邮箱这个视图也是必须登录用户才能进,所以我们也要进行判断,但是添加邮箱这个请求是ajax请求,需要返回json类型的数据,而Django所提供的LoginRequiredMixin返回的不是json类型的数据。所以我们要自定义一个可以返回json类型的判断登录的类。我们在utils中定义一个LoginRequiredJSONMixin可以返回json的类,继承自LoginRequiredMixin类,重写handle_no_permission()方法,在这个方法中,返回JsonResponse响应。
  接下来,用户在保存邮箱之后,我们需要给用户的邮箱发送验证邮件,Django提供了一个发送邮件的方法send_mail(),要给方法传邮件标题、邮件正文、发件人、收件人列表等参数。这时,我们虽然有了发邮件的方法,但是我们还要准备一个发邮件的服务器,也就是163、QQ等邮箱帮我们发邮件。在这些邮箱里面都有一个SMTP/POP3服务,我们要把这个服务开启,会有一个授权码。接着在项目开发配置文件中,配置邮件服务器的参数:EMAIL_BACKEND(指定邮件后端,我们使用Django提供的django.core.mail.backends.smtp.EmailBackend)、EMAIL_HOST(发邮件主机)、EMAIL_PORT(发邮件端口)、EMAIL_HOST_USER(授权的邮箱)、EMAIL_HOST_PASSWORD(授权码)、EMAIL_FROM (发件人抬头)
  与发送短信验证码一样,发送验证邮件同意不能阻塞返回响应,要使用Celery异步方案。在Celery包中新建email包,新增tasks.py文件,在tasks.py文件中定义发送邮件方法,并在Celery包中的main文件中注册任务。发送验证邮件方法做好之后,我们要关注一下邮件内容了,因为是要验证邮件,所以邮件内容正文应为美多商城的验证链接,所以我们要定义一个生成验证链接的方法。我们在utils中定义生成验证链接的方法,然后在这个方法中我们使用itsdangerous模块中的TimedJSONWebSignatureSerializer类,来序列化用户id和email,将序列化的结果作为我们的验证链接。首先创建TimedJSONWebSignatureSerializer的实例化对象,创建对象要传入两个参数,一个就是序列化key,也就是按照key进行序列化,key越复杂序列化之后就越复杂,另一个参数是序列化有效期。创建过对象之后,使用对象调用dumps()方法,然后将用户id和email传入,就可以得到序列化结果,然后将序列化结果拼接到查询字符串参数中,得到验证邮箱链接。
  用户在接收到验证邮件,点击验证链接时,会向服务器发送一个get请求,定义一个邮箱验证视图,在子路由中添加路由,定义一个get方法。首先接受查询字符串参数,然后就要根据查询字符串参数进行查找对应用户。在utils中定义一个反序列化并返回用户对象的方法,在这个方法中,首先我们应该实例化TimedJSONWebSignatureSerializer对象,传入的两个参数必须要和序列化的时候传入的一致,然后使用对象调用loads()方法,将序列化的字符串传入,就会得到我们之前的原始数据。在调用loads()方法时,要try一下,因为有可能token已经过期了。所以如果出现BadData异常,就返回None,反之就将查询出来的user_id和email作为条件进行查询用户,然后将用户对象返回。get方法中,调用反序列化方法后,判断返回的是否是None,如果是None就响应错误信息,如果是用户对象,就将该用户对象的email_active的值修改为True,然后重定向到首页。
三.收货地址
  创建一个areas子应用用来操作收货地址,并在项目配置文件中注册子应用,在总路由中添加路由,然后新建一个自关联的数据表用来存储省市区信息。用户在选择地区时,前端会发送ajax的get请求,可能会携带area_id参数,也可能不携带,如果携带参数则表示要获取市/区的信息,反之则表示要获取省的信息。首先定义一个get方法,然后接受参数,然后判断参数是否存在。如果area_id不存在,就获取省份信息,将parent is None作为条件查询出来所有的省份,然后将省份模型列表转化为字典列表,响应给前端。如果area_id存在,就将area_id作为条件先查询出对应的省份对象,然后使用一查多的语法查询出对应的市/区模型列表,然后将模型列表转化为字典列表,响应给前端。因为省市区数据基本上变化不大,但是用户每次选择地址都要查询数据库,极大的降低了效率,所以我们可以将查询出来的省市区数据进行缓存。使用Django提供的cache模块进行缓存,在前端发过来请求时,首先判断缓存中是否存在,如果缓存中没有,再查询数据库,然后查询出来之后再保存进缓存。
  地址数据弄好之后,我们就要进行用户地址的增删改查了,首先在User子应用中的model中新建一个用户地址模型类,并在User模型类中新增一个默认地址字段。在views中定义新增用户收货地址的视图类,并在子路由中新增路由。用户在新增收货地址时,前端会向服务器发送ajax的POST请求,在请求体中携带六个必传参数:receiver(收货人),province_id(省id),city_id(市id),district_id(区id),place(详细地址),mobile(手机号),以及两个可选参数tel(固定电话),email(邮箱)。在视图类中定义post方法,在post方法中接受参数,然后校验必传参数的完整性和手机号的合法性。校验之后,将用户传入的数据保存到数据库中,保存之后,判断用户是否有默认地址,如果没有的话,就将新增的这个地址设置为默认地址,然后返回响应。
  在views中定义查询用户收货地址的视图类,在子路由中新增路由,在该视图类中定义get方法,然后在get方法中,从request中获取登陆用户,然后将用户作为条件查询收货地址列表,然后将模型列表转换为字典列表,将字典列表和html文件响应给前端。
  用户在修改地址时,前端会发送ajax的PUT请求,修改地址的请求与新增地址的请求一样,只是多了一个路径参数address_id。新建一个修改地址的视图类,在子路由中新增路由,然后定义put方法,在put方法中与新增地址逻辑类似,首先接受参数,校验参数,然后再将用户传入的数据覆盖保存到数据库中,保存之后,返回响应。
  删除地址与修改地址的请求路径一样,只不过请求方法和参数不同,删除地址时是DELETE请求,只携带了一个路径参数address_id。定义一个delete方法,在delete方法中,先接受参数,然后将address_id作为条件进行查询地址对象,然后将查询出来的地址对象的is_delete属性值修改为True,实现逻辑删除,删除之后,返回响应。
  用户可以在收货地址展示页,将不是默认地址的收货地址,设置为默认地址,在用户设置默认地址时,会向服务器发送一个ajax的PUT请求,并携带一个路径参数address_id。定义一个设置默认地址的视图类,在子路由中新增路由,然后定义put方法,在put方法中将address_id作为条件查询出地址对象,然后从request中获取用户对象,然后将用户对象的default_address属性修改为查询出来的地址对象,然后返回响应。
  因为地址标题在新增地址时默认为收货人,所以用户可以在收货地址展示页修改地址标题,用户修改地址标题时,会向服务器发送一个携带路径参数address_id和一个请求体参数title的ajax的PUT请求。定义修改地址标题的视图类,并在子路由中新增路由,然后定义put方法,在put方法中,首先接受参数title,然后将address_id作为条件查询出地址对象,然后修改地址对象的title属性为参数title。修改完成后,返回响应。
四.修改密码
  首先定义修改密码的视图类,并在子路由中添加路由,然后定义get方法,返回修改密码界面。用户在修改密码时,前端会向服务器发送一个POST请求,并携带三个表单参数old_password、new_password、new_password2。定义一个post方法,在post方法中首先接受这三个参数,然后校验参数的完整性和合法性,以及两个新密码是否一致。校验之后,从request中获取登陆用户对象,通过用户对象调用Django自带的用户验证系统check_password(),判断密码是否正确,不正确就返回错误信息,正确的话就通过用户对象调用set_password()方法,将用户要修改的密码保存进数据库。修改密码成功之后,清除状态保持,并重定向到登陆页面。
用户基本信息
验证邮箱邮件
收货地址展示
省级信息
修改密码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑马Python教程实战项目--美多商城(五) 的相关文章

随机推荐

  • resetlog

    来自于itpub的一篇文章 http space itpub net 16628454 很多人说 resetlogs就是不完全恢复 这是不对的 做不完全恢复必须使用resetlogs 但resetlogs也可以做完全恢复 而noresetl
  • # 第四届蓝桥杯JavaB组省赛-马虎的算式

    第四届蓝桥杯JavaB组省赛 马虎的算式 题目描述 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 4
  • 解决idea文件properties中文乱码问题

    有时候将项目代码拉取至本地用idea打开时会出现中文乱码问题 遇到这种问题不要慌 重新设置一下编码为UTF 8即可 那么如何将idea的编码统一设置为UTF 8格式呢 接下来我们一一解决此类问题 1 打开idea编译器 有时候会看到打开的文
  • WebGIS工程师进阶训练营

    WebGIS工程师进阶训练营 1 WebGIS课程综述 2 多类情景部署SuperMap iServer 2 1 Linux环境部署SuperMap iServer 2 2 war包部署 2 3 常见问题排查 3 SuperMap iSer
  • word添加、更新目录

    1 显示导航窗口 视图 导航窗口 2 文档中的目录 2 1 插入目录 引用 目录 2 2 更新目录 方式一 点击下图 更新目录 方式二 引用 更新目录
  • WinForm使用鼠标裁剪图像

    之前做一个试卷识别的项目的时候需要预先将各个部分裁剪开然后进行识别 而网上的裁剪函数都是记录鼠标的位置然后进行裁剪 public static Bitmap PartDraw Image src Rectangle cutpart 切割图片
  • (休息几天)读米什金之货币银行学——货币与汇率

    1货币 当一国货币升值时 相对于其他货币价值上升 则该国商品在国外变得更贵 而外国商品唉本国则变得更便宜 相反 一国货币贬值 则该国商品在国外更便宜 而外国商品在本国则变得更贵 货币升值使得本国制造的商品在国外竞争力下降 而国外商品在本国竞
  • Koa2.js router 异步返回ctx.body失效的问题

    koa2 js 用router返回数据时 正常写法如下 我是将接口封装了 一个很普通的koa2 js get请求 router put getUserInfo ctx next gt const data ctx request body
  • PHP自己的框架2.0版本目录结构和命名空间自动加载类(重构篇一)

    目录 1 目录结构演示效果 2 搭建目录结构 以及入口public gt index php 3 引入core下面core gt base php 4 自动加载实现core gt fm gt autoload php 5 框架运行文件cor
  • Basic Level 1012 数字分类 (20分)

    题目 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A 1 A 1 A1 能被 5 整除的数字中所有偶数的和 A 2
  • matlab 取余(rem)和取模(mod)的区别

    取余 rem 和取模 mod 的区别 Matlab 生成机制 取余 采取fix 函数 向0方向取整 取模 采取floor 函数 向无穷小方向取整 当A B异号时 其实同号也是这个规律 取余 结果和A同号 取模 结果和B同号 PS 在js c
  • ASP .net core 整合 nacos 通过Spring Cloud Gateway 网关访问

    ASP net core 整合 nacos 通过Spring Cloud Gateway 网关访问 使用vs创建web项目 选择api 注意这里要取消掉Https配置否则使用网关转发也需要配置为https请求这里我们直接取消 添加nacos
  • WebRTC实现多人视频聊天

    写在前面 实现房间内人员的视频聊天 由于并未很完善 所以需要严格按照步骤来 当然基于此完善 就是时间的问题了 架构 整个设计架构如下 图片来自于参考博文 我使用的是第一种Mesh 架构 无需任何流媒体服务器 直接利用成熟的WebRTC 协议
  • windows10进程查询命令、端口占用查询命令、杀进程命令

    windows环境下编码开发经常遇到端口占用问题 解决时需要找到对应进程杀掉 释放占用 自己常用的几项操作命令如下 首先 打开Windows的命令窗口 键盘 win R 输入cmd 回车 1 查询端口被占用的进程 命令 netstat ao
  • 马虎的算式 有一次,老师出的题目是:36 x 495 = ?他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!!

    马虎的算式 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 495 396 45 17820 类似这样
  • 信息传递【NOIP2015】【强连通分量 Tarjan】

    题目链接 题目描述 有 n 个同学 编号为 1 到 n 正在玩一个信息传递的游戏 在游戏里每人都有一个固定的信息传递对象 其中 编号为 i 的同学的信息传递对象是编号为Ti的同学 游戏开始时 每人都只知道自己的生日 之后每一轮中 所有人会同
  • python链家新房信息获取练习

    使用python对链家新房相关数据进行爬取 并进行持久化存储 文章目录 前言 一 页面分析 二 代码编写 1 数据库表的建立 2 代码编写 结果 前言 保持练习 以下是本篇文章正文内容 下面案例可供参考 一 页面分析 老样子进行页面分析 u
  • 解决在win10下DNS_PROBE_FINISHED_BAD_CONFIG问题

    解决在win10下DNS PROBE FINISHED BAD CONFIG问题 打开控制面板 进入 网络和 Internet 进入 网络和共享中心 进入 更改适配器设置 选择当前使用的网络链接适配器 点击 属性 选择 Internet协议
  • C++:带内嵌对象成员的派生类的构造函数,析构函数的声明方式与执行的先后顺序

    声明了某个带内嵌对象成员的派生类的对象并进行初始化时 我们要使用到派生类的构造函数 在这时 派生类的构造函数会调用内嵌对象 父类 基类 的构造函数 那么 这些构造函数的执行顺序是什么呢 我们知道 被继承的类可以被叫做父类或基类 因此它作为构
  • 黑马Python教程实战项目--美多商城(五)

    一 用户基本信息 首先需要为用户模型类 也就是用户数据表 补充一个邮箱验证状态字段 用来记录用户的邮箱是否验证成功 然后新建用户中心视图类 继承LoginRequiredMixin和View类 在子路由中添加路由 定义get方法 在requ