Django 项目结束,对项目进行简单总结
项目准备
美多商城是一种 B2C 的商业模式,即企业对个人,这种模式一般是网上购物,代表有京东、淘宝。
需求分析
用户模块
商品模块
购物车模块
订单模块
支付模块
项目架构
- 项目采用前后端分离的应用模式
- 前端使用 vue.js
- 后端使用 Django REST framework
- 数据库使用:mysql、redis
- 异步服务:celery
- 分布式服务:FastDFS
创建工程
使用 git 来管理项目代码,代码放在 gitee 或者 github,公司通常也会放在 gitlab 私有服务器中
创建项目
使用前端 node.js 提供的服务器 live-server 作为前端开发服务器使用
创建数据库,创建数据库用户
create database meiduo_mall default charset=utf8;
create user meiduo identified by 'meiduo';
grant all on meiduo_mall.* to 'meiduo'@'%';
flush privileges;
配置
修改settings/dev.py 文件中的路径信息
在INSTALLED_APPS中添加rest_framework
数据库 mysql
Redis
本地化语言与时区
日志
异常处理
用户部分
基本功能:用户注册、登录、忘记密码、第三方(QQ登录)、个人信息、地址管理、修改密码
创建用户模型类:Django提供了django.contrib.auth.models.AbstractUser用户抽象模型类允许我们继承,扩展字段来使用Django认证系统的用户模型类。
用户注册
图片验证码和短信验证码
图片验证码和短信验证码可能后续也会使用,将这两个放到一个单独的应用中 verifications,在此应用中实现图片验证码、短信验证码。
验证码流程分析:
- 前端生成图片验证码对应的 UUID;
- 发送请求到后端,由后端(使用第三方扩展 captcha)生成图片验证码的文字和图片,图片返回给前端,文字以 UUID 为键存到redis中;
- 前端展示图片验证码,用户进行输入,
- 点击发送短信按钮,发送请求到后端,对图片验证码进行校验,同时也判断一下短信发送的频率
- 校验通过,生成短信验证码,保存短信验证码,在这里在保存一个短信验证码发送间隔,防止多次发送,发送短信验证码(使用第三方扩展 云通讯)
判断用户名是否存在
- 用户输入用户名之后使用 axios 局部刷新页面
- 后台查询数据库用户是否存在
- 返回数据给前端
判断手机号码是否已经存在
- 用户输入手机号之后使用 axios 局部刷新页面
- 后台查询数据库手机号是否存在
- 返回数据给前端
前端进行初步操作
使用正则判断用户名是否符合规则
使用正则判断密码输入是否符合规则且两次输入是否一致
使用正则判断手机号是否符合规则
注册
1.信息输入完后,点击注册,向后端发送请求,将数据传到后端
2.后端通过序列化器对数据进行验证,并将数据保存到数据库中
3.生成保存当前用户登录信息的 JWT token
4.返回信息,注册成功
使用到的技术点
celery
前端用户将图片验证码发送给后台之后,第三方平台发送短信的过程中会有网络的阻塞程序继续往下执行,进而影响用户体验效果;
解决方案:采用celery进行短信验证码的异步发送;
Celery概念:分布式异步任务队列调度框架:
1,支持定时任务和异步任务两种方式
2,组成:大概分为四个部分client客户端发送数据,broker中间件(redis数据库,消息队列),worker(任务的执行者),backend(执行worker任务的执行结果)
3,可以开启多进程也可以是多线程
4,应用场景:在某一个任务的执行过程中,会涉及到耗时的操作,但是这个耗时操作并不会影响后续的程序的执行,此时就可以用celery来异步执行这些任务;
跨域请求:
为前后端各设置一个域名,请求时就会出现跨域请求
跨域请求CORS
OPTION
浏览器会发送给option请求询问,后端是否支持
后端提供option请求的支持,告诉浏览器,支持哪些域名访问
Django中间件提供option请求
安装第三方包:pip install django-cors-headers
添加应用,设置中间层,在最上边添加中间件,添加白名单
JWT token:
在用户登录后,我们需要记录用户的登录状态,传统的是使用 session 进行保存,每个用户登录后都会在后端做一次记录,session 保存在内存中,随着用户增多,服务端开销会增大;扩展性不好,用户必须请求存储 session 的这台服务器;session 是基于 cookie 的,如果 cookie 被拦截,用户容易受到跨站请求伪造攻击。
JWT 有三部分组成:header(头部)、payload(载荷)、signature(签名),由这三部分生成 token,可以携带信息,安全性也有保障,便于传输,不需要再服务端保存会话信息,易于应用的扩展,只需要每次请求把 token 带上即可。
手动签发 JWT:
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
前端保存 token
sessionStorage 浏览器关闭即失效
localStorage 长期有效
登录
登录最重要的就是登录信息的保存;
Django REST framework JWT 提供了登录签发 JWT 的视图 obtain_jwt_token,可以直接使用,会默认返回 token;
自定义可以使用用户名或者手机号登录。
使用正则判断,根据对应信息进行数据查询对应用户,重写认证后端,加上判断。