每日分享
Know well what leads you forward and what holds you back,and choose the path that leads you to wisdom.
要知道是什么导致你前进,是什么阻碍你,并选择引导你智慧的道路。
小闫语录:
古语『吾日三省吾身』我们在如今快节奏的生活中,需要片刻的安静,需要片刻的思考。现在的你是否每天沉浸在手机、电脑中,失去了思考的时间,闲暇的时间都充斥在了抖音快手等快餐视频中?看似从中得到了片刻的安宁愉悦,掌握了许多人生哲理,看遍了人生百态,其实呢?得到的还是放下手机后的空虚感。其实快餐文化中你得不到任何养分,那些只是昙花一现。我承认如今互联网带给我们极大的便利,但是真正从中学习的人又有多少呢?放下手机,发呆一会,思考一下自己的路。成功是因为什么,失败又是因为什么,善于总结,即使是失败,也是你一笔宝贵的财富。
美多商城项目(四)
项目地址
https://github.com/EthanYan6/E-commerce-sites.git
笔记配合代码查看效果更好哦~
1.登录用户的邮箱设置
API: PUT /email/ 参数: 通过请求头传递jwt token { "email":"邮箱", } 响应: { "id":"用户id", "email":"邮箱" }
代码逻辑:
1.获取参数并进行校验(email必传,email格式)。
可以添加一个邮箱设置序列化器类;email序列化和反序列化时都用;自动生成的字段email默认是可以不传递的,我们修改为必传;将 required
改为True。
2.设置登录用户的邮箱。
3.返回应答,邮箱设置成功。
完成视图的代码后,配置视图的url地址。
4.在序列化器类中自己设置update方法。
4.1设置用户的邮箱。
4.2给邮箱发送验证邮件。
发送邮件需要使用SMTP服务器,常用的服务器有163邮箱等。
5.在Django配置文件中,设置邮箱配置信息。需要修改邮箱和客户端授权密码,以及收件人看到的发件人。
6.使用Django提供的模块发送邮件。
使用send_email进行邮件发送:
from django.core.mail import send_email send_email(subject='标题', message='正文', from_email='发件人邮箱', recipient_list='收件人邮箱列表', html_message='多媒体正文')
Django中内置的邮件发送功能在django.core.mail模块中。
message只是普通的字符串正文,如果是多媒体正文,设置html_message。
7.发送邮件之前要生成一个验证链接。
注意:如果直接将用户的id放在验证链接中,可能会发生恶意的请求。比如其他人在链接后面1,2,3.....一个接一个的尝试。解决办法就是将用户的信息进行加密,然后把加密之后的内容放在验证链接后面。
7.1在用户模型类User中添加方法用于生成用户的邮箱验证连接地址。
7.2封装一个函数,使用celery异步发送邮件。
7.3把发送邮件代码封装成celery任务函数,在邮箱设置接口中,只是发出发送邮件任务消息。
2.用户邮箱验证
API: PUT /emails/verification/?token=<加密用户信息> 参数: 通过查询字符串传递<加密用户信息> 响应: { "message":"OK" }
代码逻辑:
1.获取token并进行校验(token必传,token是否有效)。
2.设置对应用户的邮箱验证标记email_active为True。
3.返回应答,验证成功。
3.用户地址管理
业务功能:
1.地址的增(重点)、删、改、查。
2.设置默认地址。
3.设置地址的标题。
4.省市县三级联动效果。(重点)
4.省市县三级联动
1.省市县存储
自关联:省市县地区的存储只需要一张表,表本身是一个自关联。(一个省下面有多个市,一个市下面有多个区县)
ID(地区ID) | name(地区名称) | parent_id(父级地区ID) |
200001 | 北京市 | NULL |
200010 | 北京市 | 200001 |
200110 | 海淀区 | 200010 |
定义模型类:
class Area(models.Model): """地区模型类""" name = models.CharField(max_length=20, verbose='地区名称') parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, related_name='subs', blank=True, verbose_name='父级地区') class Meta: db_table='tb_areas' verbose_name = '地区' verbose_name_plural = verbose_name
父级地区blank设置为True后,通过admin管理界面填写数据的时候,父级地区可以不填。
# 1.查询id为200001的地区 area = Area.objects.get(id=200001) # 2.查询area下级地区 由一查多 # sub_areas = Area.objects.filter(parent_id=200001) # 由一查多:一对象.多类名小写__set.all() sub_area = area.area_set.all() # 一旦设置了related_name='subs'之后,查area下级地区 sub_areas = area.subs.all()
4.1shell脚本添加地区数据
我们给数据库添加数据的时候,不一定非得在数据库中操作,我们还可以写一个脚本文件,添加一条可以多次执行的命令。
写一个 .sh
脚本文件,我们直接执行此文件就可以执行了。
#! /bin/bash mysql -u<用户名> -p<用户密码> -h<数据库服务器ip> <数据库> < sql文件;
4.2省市县三级联动API
1.获取所有省级地区的信息。
API: GET /areas/ 参数: 无 响应: [ { "id":"省id", "name":"省名称" }, ... ]
代码逻辑:
a 查询所有省级地区的信息。
b 将省级地区的数据序列化并返回。
2.选择某个省市,获取省下面的市的信息。
API: GET /areas/(?P<pk>\d+)/ 参数: 通过url地址传递省id 响应: [ { "id":"市id", "name":"市名称" }, ... ]
3.选择某个市时,获取市下面的区县的信息。
API: GET /areas/(?P<pk>\d+)/ 参数: 通过url地址传递市的id 响应: [ { "id":"区县id", "name":"区县名称" }, ... ]
4.可以将上面2、3两个接口合并,写成下面的接口。获取指定地区的信息。
API: GET /areas/(?P<pk>\d+)/ 参数: 通过url地址传递地区id 响应: { "id":"地区id", "name":"地区名称", "subs":[ { "id":"下级地区id", "name":"下级地区名称" }, ... ] }
代码逻辑:
a. 根据pk查询指定地区的信息。
b. 将地区数据序列化并返回。(地区下级地区需要进行嵌套序列化)
关联对象嵌套序列化:使用指定的序列化器
省市县三级联动只需要实现两个接口即可1、4