正文共: 3099字 预计阅读时间: 8分钟
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
笔记配合代码查看效果更好哦~
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任务函数,在邮箱设置接口中,只是发出发送邮件任务消息。
API: PUT /emails/verification/?token=<加密用户信息>
参数:
通过查询字符串传递<加密用户信息>
响应:
{
"message":"OK"
}
代码逻辑:
1.获取token并进行校验(token必传,token是否有效)。
2.设置对应用户的邮箱验证标记email_active为True。
3.返回应答,验证成功。
业务功能:
1.地址的增(重点)、删、改、查。
2.设置默认地址。
3.设置地址的标题。
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()
我们给数据库添加数据的时候,不一定非得在数据库中操作,我们还可以写一个脚本文件,添加一条可以多次执行的命令。
写一个 .sh
脚本文件,我们直接执行此文件就可以执行了。
#! /bin/bash
mysql -u<用户名> -p<用户密码> -h<数据库服务器ip> <数据库> < sql文件;
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
优质文章推荐: