美多商城项目(一)
1.在给用户受权的时候,用到了一个%,表示的是任何ip均可以链接这个数据库。换句话说,若是你换了电脑,你也是能够进行链接数据库继续开发的。前端
grant all on meiduo_mall.* to 'meiduo'@'%';
1.用户信息的存储
用户表分析ajax
ID
用户名
密码
手机号
邮箱
是否管理员is_admin
是否注销is_delete
想要生成表,须要定义一个模型类。Django里面不须要定义模型类了。redis
Django的认证系统已经为咱们提供了一个用户模型类,还提供了认证和受权功能。数据库
Django认证机制依赖于session机制,但咱们使用JWT认证机制。后端
is_staff是否能够访问admin站点,至关于以前咱们用的is_admin
is_superuser超级管理员
系统的模型类中,缺乏咱们须要的一些字段,那么咱们能够自定义用户模型类,采用继承就能够解决这个问题。在迁移以前,咱们须要在配置文件中设置一下,不然,系统不知道咱们定义了模型类。api
AUTH_USER_MODEL = 'users.User'
若是咱们直接使用了系统的模型类,那么那张用户表叫作auth_users。跨域
2.设计接口的思路
咱们在接到了工做任务的时候,那么咱们按照下面的思路来思考。浏览器
业务功能:分析子业务(子功能),每一个子业务设计一个API接口服务器
API设计过程:session
2.用户名是否存在
3.手机号是否存在
4.注册信息的保存
四个子业务,那么设计四个API接口。
2.1.1获取短信验证码
API: GET /sms_codes/
参数:
经过url传递手机号
响应:
{
"message":"OK"
}
补充功能:
1.短信发送60s间隔限制(同一个手机在60以内只发一个短信验证码)
2.redis管道的使用:
能够向redis管道中添加多个redis命令,而后一次性进行执行(能够作到只链接一次redis,那么网站的效率会高一点。)
2.1.2 异步发短信
为何使用:传统的方式形成用户长时间的等待
解决:
1.将发送短信的代码抽取成一个函数
2.在短信发送API接口中建立一个进程调用发送短信函数。
问题:
1.若是客户端请求较多,就会形成服务器压力过大。
咱们可使用稍后介绍的celery
2.1.3Celery异步任务队列
本质:经过提早建立的进程调用函数来实现异步的任务。
建立的进程能够在不一样的服务器上。
概念:
1.任务执行者( worker):提早建立的进程
2.任务发出者:发出任务信息,让执行者去调用某个函数( 任务函数)
3.中间人( broker):存听任务消息。
特色:
1.任务执行者的进程能够单独在其余电脑上进行建立。
2.中间人又叫作任务队列,先添加到队列中的任务消息会先被worker所执行。
3.生产者-消费者模型。
注意:中间人能够是rabbit-mq,也能够是redis,咱们使用redis。
使用:
1.安装
pip install celery
2.建立一个Celery类的对象并进行配置,是为了配置中间人的地址。
from celery import Celery
celery_app = Celery('demo')
celery_app.config_from_object('配置文件的包路径')
broker_url = 'redis://127.0.0.1:6379/3'
3.封装任务函数
@celery_app.task(name='send_sms_code')
def send_sms_code(a,b):
# ...
pass
4.启动celery的worker( 建立工做的进程)
celery -A 'celery_app对象所在文件包路径' worker -l <日志级别>
日志级别:critial fatal、error、warn、info、debug
5.发出任务消息
send_sms_code.delay()
2.2用户名是否存在
获取用户名的数量。
API:GET /usernames/(?P
参数:
经过url地址传递用户名
响应:
{
"username":"用户名",
"count":"数量"
}
2.3手机号是否存在
获取手机号的数量。
API: GET /mobiles/(?P
参数:
经过url地址传递手机号
响应:
{
"mobile": "手机号",
"count": "数量"
}
3.经过域名访问网站
静态文件服务器:127.0.0.1:8080 ---> www.ethanyan.site:8080
后端API服务器:127.0.0.1:8000 -----> api.ethanyan.site:8000
域名对应IP
经过域名访问网站 --->DNS解析( 根据域名获取对应的ip)--->再访问ip对应的服务器。
经过域名访问网站 --->先到本地 /etc/host文件中查找域名和ip对应关系,若是找到,直接根据ip访问对应的服务器,再也不进行DNS解析,若是找不到,才会进行DNS解析过程。
注意:若是想经过一个域名访问到Django网站服务器,须要将域名添加到 ALLOWED_HOSTS中。
4.一些小的知识点
1.日志的记录等级,常见四种大小关系是:
DEBUG < INFO < WARNING < ERROR
只有记录级别大于或者等于该级别的信息才会输出。
5.跨域地址
同源地址:对于两个url地址,若是协议,ip和端口彻底一致,这样的地址就是同源地址,不然就不是同源地址。
跨域请求:客户端发出请求时,若是源请求地址和被请求地址不是同源,这个请求就是跨域请求。
源请求地址: http://www.ethanyan.site:8080/
被请求地址: http://api.ethanyan.site:8000/
浏览器在发起ajax跨域请求时,会有CORS跨域请求的限制
在发起跨域请求时,在请求中携带一个请求头:
Origin:源请求地址
被请求的服务器在返回响应时,若是容许源地址对其进行跨域请求,须要在响应时携带一个响应头:
Access-Control-Allow-Origin:源请求地址
浏览器若是发现被请求的服务器在返回响应时,没有携带 Access-Control-Allow-Origin:源请求地址响应头,浏览器会直接将请求驳回,而后进行报错。
CSRF跨站请求是否是跨域请求?
答:是跨域请求。
总结
1.Django认证系统用户模型类
class User(AbstractUser):
mobile = models.CharField(max_length=11,verbose_name='手机号')
....
AUTHUSERMODEL = 'users.User'
2.接口设计思路
分析子业务,每一个子业务实现一个API接口
a.请求方式和URL地址
b.接口所需的参数和格式
c.接口的响应数据和格式
3.短信验证码获取
基本业务逻辑
a.随机生成6位数字做为短信验证码
b.在redis中存储短信验证码内容,以 sms_
c.使用云通信给手机号发送短信
d.返回应答,短信发送成功
补充两个功能:
a.短信发送60s间隔限制
b.redis管道的使用
4.本地域名设置
/etc/hosts
5.跨域请求
同源地址:协议,ip,port彻底一致
跨域请求:浏览器发请求时,若是源地址和被请求地址不是同源,这个请求就是跨域。
浏览器针对Ajax跨域请求,有CORS跨域请求的限制。
6.celery异步任务队列
使用celery异步发送短信验证码,解决用户点击获取短信验证码以后,长时间等待。
7.用户名和手机号是否存在
获取用户名数量 1.根据用户名查询数据库,获取查询结果数量 2.返回用户名数量