一.用户基本信息
  首先需要为用户模型类,也就是用户数据表,补充一个邮箱验证状态字段,用来记录用户的邮箱是否验证成功。然后新建用户中心视图类,继承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()方法,将用户要修改的密码保存进数据库。修改密码成功之后,清除状态保持,并重定向到登陆页面。




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

  1. 零基础也能快速上手的python实战项目----美多商城

    美多商城:课时安排16天 黑马程序员python企业级开发项目-手把手从0到1开发<美多商城>_哔哩哔哩_bilibili 美多商城属于B2C电商平台,商城销售自营商品给顾客.系统前台包括 ...

  2. Python人工智能实战项目教程免费分享学习:人工智能项目《AI在线医生》

    人工智能可以说是大家都在说的,但是真正会做人工智能的程序员还是少数,为了更好地提升自己,现在仍然有很多小伙伴都在寻找人工智能的项目,今天就给小伙伴们分享一下人工智能的学习项目:<AI在线医生&g ...

  3. python入门新手项目-Python入门实战项目有哪些适合新手?

    Python入门实战项目有哪些适合新手?目前市面上有很多适合新手的Python入门练手项目,Python入门需要理论与实践相结合,前面夯实基础知识,后面通过实战项目帮助你更好的运用这些Python知识 ...

  4. 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

  5. python爬虫项目-32个Python爬虫实战项目,满足你的项目慌

    原标题:32个Python爬虫实战项目,满足你的项目慌 爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬 ...

  6. 10个Python爬虫实战项目

    Python爬虫是指使用Python语言编写程序,自动化地从互联网上获取数据并进行处理和分析的技术.Python爬虫是一项复杂而且实用的技术,需要掌握多个方面的基础知识,并具备较强的编程能力和实际操作 ...

  7. python简单实战项目:《冰与火之歌1-5》角色关系图谱构建

    前两天<权力的游戏>第七季发布了第二弹预告片,思索的第七季也快要来了,正想着脑子突然一热,要不弄个<权利的游戏>的角色共现图谱吧.故事里面的人物关系复杂程度也是出了名了的,如果 ...

  8. 廖雪峰Python教程 实战day05

    廖雪峰Python教程 实战day05 1. Web程序工作流程 本文部分文字内容.图片摘自<Flask Web开发实战:入门.进阶与原理解析>,作者李辉. 在编写自己的Web框架之前,首 ...

  9. Python趣味实战项目:抢红包提醒助手

    最近后台有朋友问我学Python去哪刷题?我觉得看完Python的基础知识后,如果不着急找工作,在力扣上适当的刷刷题巩固下基础知识后,可以慢慢学着写一些有趣的小项目,对你学习Python会更有帮助些. ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(2)
  2. DIV+CSS如何设置字体间距
  3. 使用协同过滤进行众包服务的工人工作自动化推荐
  4. 15分钟从零开始搭建支持10w+用户的生产环境(四)
  5. 《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
  6. centos 需要哪些常用端口_Docker 最常用的镜像命令和容器命令
  7. centos7 安装MyCli MySQL 客户端
  8. 如何提升人脸识别的精度_宝比万像人脸识别:健身房人脸识别门禁系统如何助力健身房管理?...
  9. 服务端开发所需技能归纳
  10. 工厂无线wifi短信验证码认证方案
  11. dagger2简单使用与理解笔记
  12. 如何设置电脑的固定IP地址
  13. js用函数找出1 - 1000 之间7的倍数和包含7的数字,放入数组内
  14. ElGamal公钥密码算法(Python实现)
  15. 【Matlab编程】新手入门第五天
  16. 前端请求跨域,原来是谷歌浏览器的限制
  17. 微信APP支付申请方法
  18. Java中的Swing概述
  19. 索引一般加在什么字段上_在价值上亿的豪华游轮做服务员,是什么体验?网友:也就一般般吧...
  20. Mysql如何才能走索引排序?

热门文章

  1. 在中国大陆,XGP对比Steam有什么优势?
  2. 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,用Python编写程序,问有多少种摆法?并列举出所有摆法。
  3. Wide Deep Learning for Recommender Systems【论文记录】
  4. 有容云:容器驱动的PaaS平台实现方案(上)
  5. 数据中心网络学习资料
  6. Android的adb指令单刷boot、apk的方法
  7. 学习Qt的资源论坛博客等
  8. 硬核小学生:玩自己写的游戏,未来想造机器人
  9. 以太坊开发框架——Truffle的基础使用
  10. 2019 香(shen)港(zhen)Regional补题