一、创建模型类
1、创建users应用并注册
进入到apps目录下,执行python ../../manage.py startapp users
在dev.py中的INSTALLED_APPS =写入'users.apps.UsersConfig',
2、创建user类
在users下的models.py中创建,因为AbstractUser类中没有手机号这个属性,本项目需要额外添加该属性
class User(AbstractUser):
"""用户模型类"""
mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
class Meta:
db_table = 'tb_users'
verbose_name = '用户'
verbose_name_plural = verbose_name
3、修改配置
我们自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用我们自定义的模型类。
在dev.py中添加
AUTH_USER_MODEL = 'users.User'
4、数据库迁移
python manage.py makemigrations
python manage.py migrate
二、图片验证码接口
1、创建验证应用
图片验证码、短信验证码考虑到后续可能会在其他业务中也用到,因此我们将图片验证码独立,创建一个新应用verifications,在此应用中实现图片验证码、短信验证码。
进入到apps目录下,执行python ../../manage.py startapp verifications
在dev.py中的INSTALLED_APPS =写入'verifications.apps.verificationsConfig',
2、导入第三方包
将图片验证码的包放到项目libs包中,在verifications应用中的view.py中导入
from meiduo_mall.libs.captcha.captcha import captcha
text,image=captcha.generate_captcha()
3、创建redis的二号仓库
"verify_codes": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.211.55.5:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
4、写入缓存
# 将图片验证码写入缓存
conn=get_redis_connection('verify_codes')
conn.setex('img_%s'%image_code_id,300,text)
5、返回图片
from django.http import HttpResponse
# 返回图片验证码
return HttpResponse(image,content_type='images/jpg')
5、路由匹配
子路由中:
from django.conf.urls import url
from verifications import views
url('^image_codes/(?P<image_code_id>[\w-]+)/$', views.ImageCodeView.as_view()),
总路由中:
url(r'^', include('verifications.urls')),
6、host设置
前端 www.meiduo.site
后端 api.meiduo.site
编辑/etc/hosts文件,可以设置本地域名
sudo vim /etc/hosts
在文件中增加两条信息
127.0.0.1 api.meiduo.site
127.0.0.1 www.meiduo.site
7、修改settings配置中的ALLOWED_HOSTS
一旦不再使用127.0.0.1访问Django后端,需要在配置文件中修改ALLOWED_HOSTS,增加可以访问后端的域名
ALLOWED_HOSTS = ['api.meiduo.site', '127.0.0.1', 'localhost', 'www.meiduo.site']
三、短信验证码接口
1、定义图片验证码序列化器
在verifications/serializers.py中定义序列化器,用以校验
class ImageCodeCheckSerializer(serializers.Serializer):
"""
图片验证码校验序列化器
"""
image_code_id = serializers.UUIDField()
text = serializers.CharField(max_length=4, min_length=4)
def validate(self, attrs):
"""
校验
"""
image_code_id = attrs['image_code_id']
text = attrs['text']
# 查询真实图片验证码
redis_conn = get_redis_connection('verify_codes')
real_image_code_text = redis_conn.get('img_%s' % image_code_id)
if not real_image_code_text:
raise serializers.ValidationError('图片验证码无效')
# 删除图片验证码
redis_conn.delete('img_%s' % image_code_id)
# 比较图片验证码
real_image_code_text = real_image_code_text.decode()
if real_image_code_text.lower() != text.lower():
raise serializers.ValidationError('图片验证码错误')
# 判断是否在60s内
mobile = self.context['view'].kwargs['mobile']
send_flag = redis_conn.get("send_flag_%s" % mobile)
if send_flag:
raise serializers.ValidationError('请求次数过于频繁')
return attrs
2、生成短信验证码
导入云通讯包,生成短信验证码
3、 验证短信验证码的发送请求的时间
4、将短信验证码写入缓存
5、发送短信验证码
6、celery处理短信异步发送
在项目中创建celery_task包,创建config与main的py文件