最新要闻
- 叶辰是什么电视剧
- 环球观速讯丨迷惑行为!女司机给奥迪Q3加玻璃水:一股脑全倒进机油壶
- 天天热门:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元发车
- 全球最资讯丨看片、下载神器!四盘位NAS极空间Z4s史低价:2899元
- 世界即时:阿里影业总裁谈《长空之王》:展现了我们的意志力和信心
- 焦点!东风系疯狂补贴!雪铁龙、标致、本田大降价:12万能买C级轿车
- 天天简讯:长沙银行:向不特定对象发行可转债申请获上交所受理
- 男子临时起意偷井盖 外卖小哥挺身而出上前制止
- 聚焦:N卡CPU占用率高的bug确认了 NVIDIA表态:即将修复
- 世界看点:中国著名雷达专家王小谟逝世 享年84岁
- 每天暴卖7000辆 但比亚迪的“卷杀”还没有要停下来的意思
- 世界关注:古巴一波音737客机撞鸟 引擎起火客舱浓烟弥漫
- 中信证券:海外锂价对国内出现明显溢价或对锂价形成支撑
- 全球快看:没商量余地!日本核污水排海将影响整个生物圈 海产品或都有辐射
- 《最后生还者》收视率再创新高
- 四川大学生组团去工地吃饭:13块随便吃 好吃又实惠
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【世界播资讯】封装发送短信功能的封装过程
(资料图)
目录- 第一步:在发送短信平台注册账号
- 第二步:新建一个包具体文件夹目录结构如下
- 1. init.py代码
- 1. settings.py代码
- 2. sms.py代码
- 第三:写了发送短信的接口
- 1. 视图类
- 2. 序列化类
- 3. 路由
第一步:在发送短信平台注册账号
具体步骤戳这里
第二步:新建一个包具体文件夹目录结构如下
前提条件是要下第三方模块,具体步骤戳这里之后我们开始封装功能
send_sms_v3 包__init__.py # 导入给外部使用的函数settings.py # 配置信息sms.py # 核心:获取n位数字验证码
1. init.py代码
from .sms import get_code, send_sms
1. settings.py代码
点击查看代码
SECRET_ID = "密钥key值"SECRET_KEY = "密钥value值"APP_ID = "APP的id编号"SIGN_NAME = "签名"TEMPLATE_ID = "模板id"
2. sms.py代码
点击查看代码
from tencentcloud.common import credentialfrom tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKExceptionfrom tencentcloud.sms.v20210111 import sms_client, modelsfrom tencentcloud.common.profile.client_profile import ClientProfilefrom tencentcloud.common.profile.http_profile import HttpProfilefrom . import settingsimport randomimport json# 产生随机验证码的函数def get_code(number=4): code = "" for i in range(number): code += str(random.randint(0, 9)) return code# 发送短信函数def send_sms(code, mobile): try: cred = credential.Credential(settings.SECRET_ID, settings.SECRET_KEY) httpProfile = HttpProfile() httpProfile.reqMethod = "POST" httpProfile.reqTimeout = 30 httpProfile.endpoint = "sms.tencentcloudapi.com" # 指定接入地域域名(默认就近接入) clientProfile = ClientProfile() clientProfile.signMethod = "TC3-HMAC-SHA256" # 指定签名算法 clientProfile.language = "en-US" clientProfile.httpProfile = httpProfile client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile) req = models.SendSmsRequest() req.SmsSdkAppId = settings.APP_ID req.SignName = settings.SIGN_NAME req.TemplateId = settings.TEMPLATE_ID req.TemplateParamSet = [code, "30"] req.PhoneNumberSet = ["+86" + mobile,] req.SessionContext = "" req.ExtendCode = "" req.SenderId = "" resp = client.SendSms(req) res = json.loads(resp.to_json_string(indent=2)) if res.get("SendStatusSet")[0].get("Code") == "Ok": return True else: return False except TencentCloudSDKException as err: print(err) return False
第三:写了发送短信的接口
1. 视图类
点击查看代码
from libs.send_sms_v3 import get_code, send_sms as send_sms_ssfrom rest_framework.viewsets import GenericViewSetfrom rest_framework.decorators import actionfrom rest_framework.exceptions import APIExceptionfrom common_response import APIResponsefrom .serializer import UserLoginSerializer, UserMobileLoginSerializerfrom .models import Userfrom django.utils.datastructures import MultiValueDictKeyErrorfrom django.core.cache import cachefrom threading import Threadclass UserView(GenericViewSet): serializer_class = UserLoginSerializer queryset = User.objects.all().filter(is_active=True) @action(methods=["GET"], detail=False) def check_mobile(self, request, *args, **kwargs): try: # 从地址栏中取出手机号 query_params : queryDict mobile = request.query_params["mobile"] User.objects.get(mobile=mobile) except MultiValueDictKeyError as e: raise APIException("手机号格式不对") except Exception as e: return APIException return APIResponse(msg="手机号已存在") @action(methods=["POST"], detail=False) def login_mul(self, request, *args, **kwargs): return self._login(request, *args, **kwargs) @action(methods=["POST"], detail=False) def send_sms(self, request): try: mobile = request.data["mobile"] # 生成验证码 code = get_code() cache.set("sms_code_%s" % mobile, code) # 使用异步发送短信 t = Thread(target=send_sms_ss, args=[code, mobile]) t.start() return APIResponse(msg="短信已发送") except Exception as e: raise APIException(str(e)) # 重写get_serializer_class方法 def get_serializer_class(self): if self.action == "login_sms": return UserMobileLoginSerializer else: return super().get_serializer_class() def _login(self, request, *args, **kwargs): ser = self.get_serializer(data=request.data) ser.is_valid(raise_exception=True) token = ser.context.get("token") username = ser.context.get("username") return APIResponse(token=token, username=username) @action(methods=["POST"], detail=False) def login_sms(self, request, *args, **kwargs): return self._login(request)
2. 序列化类
点击查看代码
from .models import Userfrom rest_framework import serializersfrom rest_framework.exceptions import APIExceptionfrom rest_framework_jwt.settings import api_settingsfrom django.core.cache import cacheimport rejwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler = api_settings.JWT_ENCODE_HANDLERclass BaseUserSerializer(): def validate(self, attrs): user = self._get_user(attrs) token = self._get_token(user) self.context["token"] = token self.context["username"] = user.username return attrs def _get_user(self, attrs): raise Exception("需要重写该方法") def _get_token(self, user): payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) return tokenclass UserLoginSerializer(BaseUserSerializer, serializers.ModelSerializer): # 重写username字段,把原来的校验规则去掉 username = serializers.CharField() class Meta: model = User fields = ["username", "password"] def _get_user(self, attrs): username = attrs.get("username") password = attrs.get("password") if re.match(r"^1[3-9][0-9]{9}$", username): user = User.objects.filter(phone=username).first() elif re.match(r"^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$", username): user = User.objects.filter(email=username).first() else: user = User.objects.filter(username=username).first() if user and user.check_password(password): return user else: raise APIException("用户名不存在或密码错误")class UserMobileLoginSerializer(BaseUserSerializer, serializers.ModelSerializer): code = serializers.CharField() mobile = serializers.CharField() class Meta: model = User fields = ["mobile", "code"] def _get_user(self, attrs): code = attrs.get("code") mobile = attrs.get("mobile") # 从缓存中取出 old_code = cache.get("sms_code_%s" % mobile) if old_code and old_code == code: user = User.objects.filter(mobile=mobile).first() if user: return user else: raise APIException("用户不存在") else: raise APIException("验证码验证失败")
3. 路由
点击查看代码
# 分路由from rest_framework.routers import SimpleRouterfrom . import viewsrouter = SimpleRouter()router.register("userinfo", views.UserView, "userinfo")urlpatterns = []urlpatterns += router.urls# 总路由from django.urls import path, includeurlpatterns = [ path("api/v1/user/", include("user.urls")),]# 访问http://127.0.0.1:8000/api/v1/user/userinfo/send_sms/# {"mobile":"输入手机号"} 发送POST请求 即可测试
【世界播资讯】封装发送短信功能的封装过程
快报:什么是流程图?一篇文章就帮你搞定了
建立私人知识网站 cpolar轻松做到1 (部署DokuWiki)
热点!cad块属性定义及应用
叶辰是什么电视剧
环球观速讯丨迷惑行为!女司机给奥迪Q3加玻璃水:一股脑全倒进机油壶
天天热门:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元发车
全球最资讯丨看片、下载神器!四盘位NAS极空间Z4s史低价:2899元
世界即时:阿里影业总裁谈《长空之王》:展现了我们的意志力和信心
焦点!东风系疯狂补贴!雪铁龙、标致、本田大降价:12万能买C级轿车
天天简讯:长沙银行:向不特定对象发行可转债申请获上交所受理
全球百事通!tabby美观且实用的终端工具(windows/macos版 ,亲测有效!!!)
Spring6超全面教程,老杜带你玩转Spring6
更改windows桌面路径的教程
全球速读:亲测可用,ChatGPT 对话技巧
男子临时起意偷井盖 外卖小哥挺身而出上前制止
聚焦:N卡CPU占用率高的bug确认了 NVIDIA表态:即将修复
世界看点:中国著名雷达专家王小谟逝世 享年84岁
每天暴卖7000辆 但比亚迪的“卷杀”还没有要停下来的意思
世界关注:古巴一波音737客机撞鸟 引擎起火客舱浓烟弥漫
今日报丨开心档之Java 9 新特性
中信证券:海外锂价对国内出现明显溢价或对锂价形成支撑
全球快看:没商量余地!日本核污水排海将影响整个生物圈 海产品或都有辐射
《最后生还者》收视率再创新高
四川大学生组团去工地吃饭:13块随便吃 好吃又实惠
天天热文:浅谈基于Web的跨平台桌面应用开发
环球视讯!聊聊消息队列中的基础概念
今日热议:吉利汽车2月销量10.87万辆 极氪同比增长87% 可自主选择是否开启单踏板
全球信息:苹果iPhone掉熊窝被叼走 第一视角记录血盆大口
快报:荣耀赵明:苹果还是行业标杆 向苹果致敬 然后超越
环球快看:人口不断下降!一周工作时间增至69小时 韩国打工人也要迎来996
6g是什么概念
简讯:父母不给买鞋28岁女儿瞬间崩溃 跪地哀求200块都不给我花:网友感叹
天天新资讯:python-模块与包
男子在LV官网买包近2年未发货:最后商家取消订单
【快播报】男子挑战18元5片天价土豆火锅店:最后点了5盘土豆吃到崩溃
今日热讯:小伙早餐喝下20个生鸡蛋 网友:是个狠人 上一个这么喝的是周润发
环球热讯:弹幕也要放广告?!还能不能让人好好看剧了
视讯!避免延期发售?曝《GTA6》可能削减本体内容移到后续DLC
焦点热议:公称抗拉强度值_公称抗拉强度
教你用QQ邮箱如何发送文件
天天速看:南昌工学院开展“保护母亲河,争当河小青”净滩环保志愿活动
天天关注:收到背去世老人下楼订单?顺丰回应引围观 网友感叹这单也敢接
每日速读!拒绝ChatGPT后:苹果光速反悔
观众对《最后生还者》真人剧选角不满:女演员与想象不符
每日速讯:女子入职10天因老板娘不同意被开除:当事人感觉“很离谱”
2-高级特性
入门云原生,你需要了解的基础知识
俄罗斯国产新电脑启用!搭载自研8核ARM处理器、运行Linux定制系统
西班牙推出3D打印植物肉:模拟真肉口感
世界快消息!iOS从安卓抄来的这5个功能:苹果用户直呼真香?
世界快消息!学生免费领取7个月云服务器
每天吃的盐:一步步伤害你的身体
女子爱吃生腌海鲜:胆管长满活虫和虫卵
世界实时:iQOO Z7系列配置泄露:最高骁龙782G、支持120W闪充
精彩看点:地方融资平台
环球简讯:郑东新区“红立方·楼事会”荣获全市基层党建“十佳书记项目”
数据漂移问题及解决方案
全球新资讯:(数据库系统概论|王珊)第十章数据库恢复技术-第三节:故障种类
今日热搜:一次Java服务内存过高的分析过程
超划算!冷酸灵泵式牙膏5件套39元发车(送牙刷+漱口水)
天天热点!M.2 SSD秒变移动硬盘!酷冷至尊神钥Air图赏
焦点速讯:亚航被曝行李超重5公斤补收1807元:拍照被威胁不要上飞机
【全球新要闻】极氪官方二手车上线:不以盈利为目的 只收12万公里0事故车辆
精选!安卓“女皇”王雪红爆料苹果MR头显最快年中发布:HTC不担心竞争
环球视点!统一日志输出打印POST请求参数
法系车疯狂降价 12万买C级车雪铁龙C6!有销售一天卖车150多台
热点聚焦:豆瓣评分仅6.0:《蚁人3》周末北美票房暴跌61%
资讯:淄博烧烤店开门一分钟坐满大学生:组团去山东撸串火出圈
699元起 荣耀手表GS 3i发布:14天长续航、支持血氧监测
《巫师3》叶奈法玩偶推出:真人尺寸 能替换服饰
全球速看:stegsolve与zsteg的使用
环球即时:用线性二次模型建模大型数据中心,基于 MPC 进行冷却控制
环球头条:2023,大前端技术趋势及小程序未来分析
全球球精选!如何使用JDBC将Cordova应用程序连接到MySQL数据库?
当前快看:北京故宫三八节门票预定时间是几点?
索尼推出IMX611景深传感器:实现高精度物距测量
天热来两件!220g重磅精梳棉:放克男士纯色T恤20元大促
小米手机在家就能自助检测!支持充电、网络等12项自检
全球快报:北京、郑州等14个省会级城市气温创今年来新高:或挑战历史最暖纪录
和14 Pro一样!iPhone 15全系登岛:苹果又搞了新配色
全球通讯!旖旎是什么意思
当前滚动:hutool XML反序列化漏洞(CVE-2023-24162)
焦点热讯:【MRTK】解决 Unity.IL2CPP.Building.BuilderFailedException: Lump_libil2cpp_vm.cp
记录--uni-app中安卓包检查更新、新版本下载、下载进度条显示功能实现
焦点信息:基于datax抽取mysql数据到HDFS
阅读并手撸JS版Naive Ui Admin骨架
京东客服确认:百亿补贴商品不支持价保!
世界消息!“点对点”自动驾驶 红旗发布E702官图:百公里人工接管小于0.5次
速讯:2499元 荣耀观影眼镜发布:轻至80g、500nit入眼亮度
世界实时:荣耀最强旗舰!一图了解荣耀Magic5至臻版:6699元
环球焦点!超薄+四种体验:冈本Okamoto金装系列1.7元/枚大促
要闻:拖胆选号怎么玩_拖胆选号
Django-2
当前观点:【建议收藏】超详细的Canal入门,看这篇就够了!!!
当前快看:3.6 C提高3day
本地硬盘文件映射公网 cpolar轻松做到
顶象中标GovHK香港政府一站通数字化项目
每日播报!《消费者报告》公布最不可靠的10款电动车:特斯拉双车上榜
微头条丨荣耀Magic 5系列亮相:曲面屏也能拥有直屏体验