一:配置(域名和模型类)
1.使用GenericAPIView+5个ModelMixin的原因:
list
create
retrieve
update
destroy
简化代码:操作不同的模型类时,序列化器与查询集不同,其它代码都相同
提供了属性:
queryset=
serializer_class=
配置两条路由规则,一条不带主键,一条带主键
1.router=DefaultRouter()
2.router.register(地址前缀,views.***ViewSet)====>注册生成路由规则
3.urlpatterns+=router.urls
在文件末尾把127.0.0.1替换成网站的域名:127.0.0.1 www.meiduo.site
127.0.0.1 api.meiduo.site
总结什么是跨域:一个域名A下的js通过Ajax请求另外一个域名下的地址,这就是跨域。
INSTALLED_APPS = (
...
'corsheaders',
...
)
'corsheaders.middleware.CorsMiddleware',
...
]
# CORS跨域白名单
CORS_ORIGIN_WHITELIST = (
'www.meiduo.site:8080', # 表示这个域名下的JS能访问api.meiduo.site
)
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
自带有用户,权限,组,一个可配置的哈希密码系统,用户登录或内容显示的表单和视图,一个可插拔的后台管理系统
因为自带的没有手机号验证,所有我们自定义一个User模型:
from django.contrib.auth.models import AbstractUser
Class User(AbstractUser):
#如我们要定义手机号,不允许重复就是unique=True
mobile=models.CharField(max_length=11,unique=True)
#定义表的名字
class Meta:
db_table='tb_users'
verbose_name='用户'
verbose_name_plural=verbose_name
这里就会出现两个用户类,这时候我们就要选择替换用户类:
把AUTH_USER_MODEL = 'users.User'放入dev.py中最下面就行了
二:业务逻辑
检查是否在60s内有发送记录
生成短信验证码
保存短信验证码(redis)与发送记录
发送短信
创建一个新应用verifications,在此应用中实现短信验证码。
在apps目录下:python ../../manage.py startapp verifications
在meiduo_sy17目录下打开终端 git add ./
提示:startapp创建出来的应用没有被管理起来,需要手动add
要让pycharm知道在apps里面去找包,右键单击apps选择Mark Directory as-->sources Root。
在verifications下的urls中配置:
url(r'^sms_code/(?P<mobile>1[3-9]\d{9})/$',views.SmsAPIview.as_view())
from rest_framework.views import APIView # 因为没有涉及模型类操作
from rest_framework.response import Response
from django_redis import get_redis_connection #用redis就需要引入此包
import random # 生成随机数
from meiduo_mall.utils.ytx_sdk.sendSMS import CCP # 发送验证码使用
class SmsAPIview(APIView):
def get(self,request,mobile):
#说明:包含有效时间的设置,推荐向redis中保存数据
#连接redis,参数是caches里面的键
# 1.验证在60s内是否向此手机号发送过短信,如果发过则返回 (这里就需要接受一个值,在url中已经说明了是mobile)
# 2.如果未发过则继续执行
# 2.1生成随机6位的验证码
# 2.2保存验证码,保存发送标记(这里需要定义一个文件)
# 2.2 这里需要与数据库进行两次交互,这步就可以用管道 redis_cli.pipeline操作对象(把命令扔到管道里一次性操作)
(在verifications下新建文件constants里面设置时间变量,短信 验证码和标记)
# 2.3发送(这里把云通讯SDK文件夹复制到utils里面就行)
pass
在连接redis那步参数连接redis数据库需要在dev文件caches缓存中加入sms (复制session内容名字改成sms),再把数据库名称改成2。再 get_redis_connection(‘sms’)
celery架构由三个模块组成:消息中间件(message broker),任务执行单元(worker) 和任务执行结果存储(task result store)组成。
消息中间件(Broker): 消息中间人,是任务调度队列,是一个独立的服务,是一 个生产者消费者模式,生产者把任务放入队列中,消费者(worker)从任务队列中取出 任务执行,任务的执行可以按照顺序依次执行也可以按照计划时间进行。但是Broker 本身不提供队列服务,所以要集成第三方队列,推荐使用RatbbitMQ或Redis.
任务执行单元(worker):即执行任务的程序,可以有多个并发。它实时监控消息 队列,获取队列中调度的任务,并执行它。
任务执行结果存储(task result store):由于任务的执行同主程序分开,如果 主程序想获取任务执行的结果,就必须通过中间件存储。同消息中间人一样,存储也可 以使用RabbitMQ、Redis;另外,假如不需要保存执行的结果也可以不配置这个模块。
更对内容参考:
http://docs.celeryproject.org/en/latest/getting-started/introduction.html
构成:
实现:
# 指定代理人使用的队列
broker_url='redis://127.0.0.1:6379/14'
from celery import Celery
# 为celery使用django配置文件进行设置
import os
os.environ['DJANGO_SETTINGS_MODULE'] = "meiduo_mall.settings.dev"
# 创建celery应用
app = Celery('meiduo')
# 导入celery配置
app.config_from_object('celery_tasks.config')
# 自动注册celery任务
app.autodiscover_tasks([
# 会自动到这个包下加载tasks.py中的任务函数
'celery_tasks.sms',
])
celery -A celery_tasks.main worker -l info
# 调用
send_sms.delay(mobile,sms_code,constants.SMS_EXPIRES/60,1)
====================总结
能够知道django的认证系统模型类的字段
username
password--->加密
新增:mobile
能够按照课件提供的思路自定义用户模型类
1.class User(AbstractUser):
新增属性
2.指定模型类
AUTH_USER_MODEL = 'users.User'
知道如何使用pipeline操作redis
redis_pipeline=redis_cli.pipeline()
redis_pipeline.***()
...
redis_pipeline.execute()
优点:只与redis交互一次
知道如何实现判断短信验证码是否频繁发送
1.在redis中以60秒存储发送标记
2.在发送前先从redis中取值做判断
能够按照课件提供的思路实现celery异步发送短信的任务
上面celery部分的实现
开发过程中,只需要4、5、6、7步
代码:
用户模型类
发短信视图
celery