ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Django开发】0到1开发美多shop项目:短信验证码和RabbitMQ。全md文档笔记 [打印本页]

作者: 勿忘初心做自己    时间: 2024-5-7 11:14
标题: 【Django开发】0到1开发美多shop项目:短信验证码和RabbitMQ。全md文档笔记

本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django + Jinja2模板引擎 + Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi服务器(美多商场业务场景),后端服务:MySQL、Redis、Celery、RabbitMQ、Docker、FastDFS、Elasticsearch、Crontab,外部接口:容联云、QQ互联、支付宝。

全套笔记和代码自取移步gitee仓:gitee仓库获取完整文档和代码

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

共 11 章,132 子模块



短信验证码

避免频繁发送短信验证码

存在的问题:
解决办法:
1. 避免频繁发送短信验证码逻辑分析


2. 避免频繁发送短信验证码逻辑实现

1.提取、校验send_flag
  1. send_flag = redis_conn.get('send_flag_%s' % mobile)
  2. if send_flag:
  3.     return http.JsonResponse({'code': RETCODE.THROTTLINGERR, 'errmsg': '发送短信过于频繁'})
复制代码
2.重新写入send_flag
  1.   
  2.   
  3. # 保存短信验证码
  4.   
  5.   
  6. redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
  7.   
  8.   
  9. # 重新写入send_flag
  10.   
  11.   
  12. redis_conn.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
复制代码
3.界面渲染频繁发送短信提示信息
  1. if (response.data.code == '4001') {
  2.     this.error_image_code_message = response.data.errmsg;
  3.     this.error_image_code = true;
  4. } else { // 4002
  5.     this.error_sms_code_message = response.data.errmsg;
  6.     this.error_sms_code = true;
  7. }
复制代码
pipeline操作Redis数据库

Redis的 C - S 架构:
存在的问题:
解决的办法:

1. pipeline的介绍

管道pipeline
实现的原理

2. pipeline操作Redis数据库

1.实现步骤
  1. 1. 创建Redis管道
  2. 2. 将Redis请求添加到队列
  3. 3. 执行请求
复制代码
2.代码实现
  1.   
  2.   
  3. # 创建Redis管道
  4.   
  5.   
  6. pl = redis_conn.pipeline()
  7.   
  8.   
  9. # 将Redis请求添加到队列
  10.   
  11.   
  12. pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
  13. pl.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
  14.   
  15.   
  16. # 执行请求
  17.   
  18.   
  19. pl.execute()
复制代码
异步方案RabbitMQ和Celery

生产者消费者设计模式

思考:

问题:

解决:

思考:
生产者消费者设计模式介绍


总结:
RabbitMQ介绍和使用

1. RabbitMQ介绍

2. 安装RabbitMQ(ubuntu 16.04)

1.安装Erlang
  1.   
  2.   
  3. # 1. 在系统中加入 erlang apt 仓库
  4.   
  5.   
  6. $ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
  7. $ sudo dpkg -i erlang-solutions_1.0_all.deb
  8.   
  9.   
  10. # 2. 修改 Erlang 镜像地址,默认的下载速度特别慢
  11.   
  12.   
  13. $ vim /etc/apt/sources.list.d/erlang-solutions.list
  14.   
  15.   
  16. # 替换默认值
  17.   
  18.   
  19. $ deb https://mirrors.liuboping.com/erlang/ubuntu/ xenial contrib
  20.   
  21.   
  22. # 3. 更新 apt 仓库和安装 Erlang
  23.   
  24.   
  25. $ sudo apt-get update
  26. $ sudo apt-get install erlang erlang-nox
复制代码
2.安装RabbitMQ
  1.   
  2.   
  3. # 1. 先在系统中加入 rabbitmq apt 仓库,再加入 rabbitmq signing key
  4.   
  5.   
  6. $ echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
  7. $ wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
  8.   
  9.   
  10. # 2. 更新 apt 仓库和安装 RabbitMQ
  11.   
  12.   
  13. $ sudo apt-get update
  14. $ sudo apt-get install rabbitmq-server
复制代码
  1.   
  2.   
  3. # 重启
  4.   
  5.   
  6. $ sudo systemctl restart rabbitmq-server
  7.   
  8.   
  9. # 启动
  10.   
  11.   
  12. $ sudo systemctl start rabbitmq-server
  13.   
  14.   
  15. # 关闭
  16.   
  17.   
  18. $ sudo systemctl stop rabbitmq-server
复制代码
3.Python访问RabbitMQ
  1.   
  2.   
  3. # Python3虚拟环境下,安装pika
  4.   
  5.   
  6. $ pip install pika
复制代码
  1.   
  2.   
  3. # 生产者代码:rabbitmq_producer.py
  4.   
  5.   
  6. import pika
  7.   
  8.   
  9. # 链接到RabbitMQ服务器
  10.   
  11.   
  12. credentials = pika.PlainCredentials('guest', 'guest')
  13. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost',5672,'/',credentials))
  14.   
  15.   
  16. #创建频道
  17.   
  18.   
  19. channel = connection.channel()
  20.   
  21.   
  22. # 声明消息队列
  23.   
  24.   
  25. channel.queue_declare(queue='zxc')
  26.   
  27.   
  28. # routing_key是队列名 body是要插入的内容
  29.   
  30.   
  31. channel.basic_publish(exchange='', routing_key='zxc', body='Hello RabbitMQ!')
  32. print("开始向 'zxc' 队列中发布消息 'Hello RabbitMQ!'")
  33.   
  34.   
  35. # 关闭链接
  36.   
  37.   
  38. connection.close()
复制代码
  1.   
  2.   
  3. # 消费者代码:rabbitmq_customer.py
  4.   
  5.   
  6. import pika
  7.   
  8.   
  9. # 链接到rabbitmq服务器
  10.   
  11.   
  12. credentials = pika.PlainCredentials('guest', 'guest')
  13. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost',5672,'/',credentials))
  14.   
  15.   
  16. # 创建频道,声明消息队列
  17.   
  18.   
  19. channel = connection.channel()
  20. channel.queue_declare(queue='zxc')
  21.   
  22.   
  23. # 定义接受消息的回调函数
  24.   
  25.   
  26. def callback(ch, method, properties, body):
  27.     print(body)
  28.   
  29.   
  30. # 告诉RabbitMQ使用callback来接收信息
  31.   
  32.   
  33. channel.basic_consume(callback, queue='zxc', no_ack=True)
  34.   
  35.   
  36. # 开始接收信息
  37.   
  38.   
  39. channel.start_consuming()
复制代码

3. 新建administrator用户
  1.   
  2.   
  3. # 新建用户,并设置密码
  4.   
  5.   
  6. $ sudo rabbitmqctl add_user admin your_password
  7.   
  8.   
  9. # 设置标签为administrator
  10.   
  11.   
  12. $ sudo rabbitmqctl set_user_tags admin administrator
  13.   
  14.   
  15. # 设置所有权限
  16.   
  17.   
  18. $ sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
  19.   
  20.   
  21. # 查看用户列表
  22.   
  23.   
  24. sudo rabbitmqctl list_users
  25.   
  26.   
  27. # 删除用户
  28.   
  29.   
  30. $ sudo rabbitmqctl delete_user admin
复制代码

4. RabbitMQ配置远程访问

1.准备配置文件
  1. $ cd /etc/rabbitmq/
  2. $ wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-server/master/docs/rabbitmq.config.example
  3. $ sudo cp rabbitmq.config.example rabbitmq.config
复制代码

2.设置配置文件
  1. $ sudo vim rabbitmq.config
  2.   
  3.   
  4. # 设置配置文件结束后,重启RabbitMQ服务端
  5.   
  6.   
  7. $ sudo systemctl restart rabbitmq-server
复制代码

配置完成后,使用rabbitmq_producer.py、rabbitmq_customer.py测试。
Celery介绍和使用

思考:
结论:
1. Celery介绍

  1. $ pip install -U Celery
复制代码
2. 创建Celery实例并加载配置

1.定义Celery包

2.创建Celery实例

celery_tasks.main.py
  1.   
  2.   
  3. # celery启动文件
  4.   
  5.   
  6. from celery import Celery
  7.   
  8.   
  9. # 创建celery实例
  10.   
  11.   
  12. celery_app = Celery('meiduo')
复制代码
3.加载Celery配置

celery_tasks.config.py
  1.   
  2.   
  3. # 指定消息队列的位置
  4.   
  5.   
  6. broker_url= 'amqp://guest:guest@192.168.103.158:5672'
复制代码
celery_tasks.main.py
  1.   
  2.   
  3. # celery启动文件
  4.   
  5.   
  6. from celery import Celery
  7.   
  8.   
  9. # 创建celery实例
  10.   
  11.   
  12. celery_app = Celery('meiduo')    # 加载celery配置    celery_app.config_from_object('celery_tasks.config')
复制代码
3. 定义发送短信任务


1.注册任务:celery_tasks.main.py
  1.   
  2.   
  3. # celery启动文件
  4.   
  5.   
  6. from celery import Celery
  7.   
  8.   
  9. # 创建celery实例
  10.   
  11.   
  12. celery_app = Celery('meiduo')    # 加载celery配置    celery_app.config_from_object('celery_tasks.config')    # 自动注册celery任务    celery_app.autodiscover_tasks(['celery_tasks.sms'])
复制代码
2.定义任务:celery_tasks.sms.tasks.py
  1.   
  2.   
  3. # bind:保证task对象会作为第一个参数自动传入
  4.   
  5.   
  6.   
  7.   
  8. # name:异步任务别名
  9.   
  10.   
  11.   
  12.   
  13. # retry_backoff:异常自动重试的时间间隔 第n次(retry_backoff×2^(n-1))s
  14.   
  15.   
  16.   
  17.   
  18. # max_retries:异常自动重试次数的上限
  19.   
  20.   
  21. @celery_app.task(bind=True, name='ccp_send_sms_code', retry_backoff=3)
  22. def ccp_send_sms_code(self, mobile, sms_code):
  23.     """
  24.     发送短信异步任务
  25.     :param mobile: 手机号
  26.     :param sms_code: 短信验证码
  27.     :return: 成功0 或 失败-1
  28.     """
  29.     try:
  30.         send_ret = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)
  31.     except Exception as e:
  32.         logger.error(e)
  33.         # 有异常自动重试三次
  34.         raise self.retry(exc=e, max_retries=3)
  35.     if send_ret != 0:
  36.         # 有异常自动重试三次
  37.         raise self.retry(exc=Exception('发送短信失败'), max_retries=3)
  38.     return send_ret
复制代码
4. 启动Celery服务
  1. $ cd ~/projects/meiduo_project/meiduo_mall
  2. $ celery -A celery_tasks.main worker -l info
复制代码

5. 调用发送短信任务
  1.   
  2.   
  3. # 发送短信验证码
  4.   
  5.   
  6.   
  7.   
  8. # CCP().send_template_sms(mobile,[sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)
  9.   
  10.   
  11.   
  12.   
  13. # Celery异步发送短信验证码
  14.   
  15.   
  16. ccp_send_sms_code.delay(mobile, sms_code)
复制代码

6. 补充celery worker的工作模式

  1.   
  2.   
  3. # 安装eventlet模块
  4.   
  5.   
  6. $ pip install eventlet
  7.   
  8.   
  9. # 启用 Eventlet 池
  10.   
  11.   
  12. $ celery -A celery_tasks.main worker -l info -P eventlet -c 1000
复制代码

用户登录

账号登录

未完待续, 同学们请等待下一期

全套笔记和代码自取移步gitee仓:gitee仓库获取完整文档和代码

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4