#发送短信优化
-
阻止请求频繁 + 管道优化redis储存 + celery异步
class SMS_CODEView(APIView): def get(self,request,mobile): conn = get_redis_connection('sms_code') flag = conn.get('sms_code_flag_%s'%mobile) if flag: return Response({'message':'请求频繁'}) sms_code = '%06d'%(randint(0,999999)) # 使用管道,连接redis的优化 pl = conn.pipeline() pl.setex('sms_code_%s'%mobile,300,sms_code) pl.setex('sms_code_flag_%s'%mobile,60,123) pl.execute() # 异步执行 # t = Thread(target=send_sms_code,args=(mobile,sms_code)) # t.start() # 借助于celery来实现 send_sms_code.delay(mobile,sms_code) return Response({'message':'OK'})
- 用户模型类创建方法
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
- celery异步执行线程
@app.task(name='send_sms_code') def send_sms_code(mobile,sms_code): ccp = CCP() ccp.send_template_sms(mobile, [sms_code, 5], 1)
-
users应用中urls
url(r'sms_codes/(?P<mobile>1[3-9]\d{9})/$',views.SMS_CODEView.as_view()), url(r'usernames/(?P<username>\w{5,20})/count/$', views.UsernameCountView.as_view()), url(r'mobiles/(?P<mobile>1[3-9]\d{9})/count/$', views.MobileCountView.as_view()),
-
用户注册模块验证是否重名
class UsernameCountView(APIView): def get(self, request,username): count = User.objects.filter(username=username).count() data = { 'username':username, 'count':count } return Response(data)
-
注意: 因为修改了目录的结构, 要修改的路径有
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo21.settings.dev")
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) import sys sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))