Django 项目总结(1)- 注册及登录

Django 项目结束,对项目进行简单总结

代码 GitHub 地址




项目准备

美多商城是一种 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,在此应用中实现图片验证码、短信验证码。

验证码流程分析:

  1. 前端生成图片验证码对应的 UUID;
  2. 发送请求到后端,由后端(使用第三方扩展 captcha)生成图片验证码的文字和图片,图片返回给前端,文字以 UUID 为键存到redis中;
  3. 前端展示图片验证码,用户进行输入,
  4. 点击发送短信按钮,发送请求到后端,对图片验证码进行校验,同时也判断一下短信发送的频率
  5. 校验通过,生成短信验证码,保存短信验证码,在这里在保存一个短信验证码发送间隔,防止多次发送,发送短信验证码(使用第三方扩展 云通讯)



判断用户名是否存在

  1. 用户输入用户名之后使用 axios 局部刷新页面
  2. 后台查询数据库用户是否存在
  3. 返回数据给前端

判断手机号码是否已经存在

  1. 用户输入手机号之后使用 axios 局部刷新页面
  2. 后台查询数据库手机号是否存在
  3. 返回数据给前端



前端进行初步操作

使用正则判断用户名是否符合规则

使用正则判断密码输入是否符合规则且两次输入是否一致

使用正则判断手机号是否符合规则




注册

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;

自定义可以使用用户名或者手机号登录。

使用正则判断,根据对应信息进行数据查询对应用户,重写认证后端,加上判断。

猜你喜欢

转载自blog.csdn.net/qyf__123/article/details/84403559