zoukankan      html  css  js  c++  java
  • 0107 Git与路飞短信云

    昨日回顾

    1、轮播图接口
    	BaseModel:is_delete、is_show、orders、update_time、created_time
    	Banner:title、image、link
    	
    2、git:版本控制器
    	客户端与服务器整合安装,任何一个客户端都可以作为服务器使用,所以可以做集群部署
    	可以采用多分支进行开发,各分支之间相互独立,可以通过合并分支将分支间的信息同步
    	
    3、git命令
    	git init [仓库名]
    	git status
    	git checkout .
    	git add .
    	git reset HEAD .
    	git commit -m '信息'
    	git reset --hard 版本号
    	git branch [新分支]
    	git checkout 分支名
    	git merge 分支
    	git remote [-v]
    	git remote add 源码 地址
    	git remote remove 源码
    	git log | reflog
    
    4、过滤文件
    
    5、线上线下操作
    	1)线下仓库准备就绪
    		将项目根文件夹初始化为仓库
    		在仓库中建立过滤文件设置过滤规则
    		将项目代码提交到本地版本库
    	2)线上仓库
    		建立一个公开的空白仓库,不能新建任何文件(空仓库不会初始化,没有.git文件夹)
    

    1.git

    线上新建

    新建仓库,将仓库clone下来`git@gitee.com:setcreed/dailyfresh.git`
    git clone 'ssh链接'
    
    git add .
    git commit -m '初始化xyz'
    git push origin master		(提交到远程仓库)
    

    仓库间通信同步

    新建文件夹
    	cd
    克隆获取线上的项目
    	git clone 'ssh链接'
    项目内新建文件
    	需要修改的代码等
    提交代码
    	git add .	到缓存区
        git commit -m '新增文件代码'	版本库
        git push origin master
        	git push origin master:master	(默认的,分支同步)
        	git push origin dev:master	(dev提交到master)
    

    协同开发

    由于线上与线下协同的开发,版本之间不同,所以提交代码要先拉再提交

    提交代码
    	git pull origin dev	 (拉取)
    	git add .	到缓存区
        git commit -m '新增文件代码'	版本库
        git push origin dev
    
    • 版本不一致
    • 修改的同一个文件
    • 文件内同一行有不同代码
    代码冲突
    <<<<<<< HEAD
    
    for i in range(10):
        print('阿忠好棒哦')
        
    =======
    class A:
    	def __init__(self):
    		self.name = name
    		
    >>>>>>> e6dd7d51a9f15151a2475d1023d5df7c0259949c
    

    远程仓库回滚

    强制提交

    如果没有先pull,不会push,但可以-f强制提交
    git push origin dev -f
    
    
    用dev分支举例
    1)本地切换到远程要回滚的分支对应的本地分支
    git checkout dev
    
    2)回滚本地分支
    git reset --hard 版本号
    
    3)本地版本强行提交给服务器
    git push origin dev -f
    

    远程仓库合并分支

    pycharm使用git

    img

    img

    img

    img

    2.luffy项目

    2.1 登录相关接口

    img

    2.2 注册相关接口

    img

    2.3 腾讯云短信api文档

    1.创建腾讯云

    1、注册开发者账号
    2、创建短信应用
    3、创建签名与模板
    

    开发者API

    2.添加应用

    img

    img

    3.创建签名与模板

    img

    img

    img

    2.4 短信功能二次封装

    安装腾讯云短信

    pip install qcloudsms_py
    

    设置短信的接口

    settings

    # 短信应用 SDK AppID
    APP_ID = 1400304609
    
    # 短信应用 SDK AppKey
    APP_KEY = "	911387d27384cefe89066967eeb92e06"
    
    # 短信模板ID,需要在短信控制台中申请
    TEMPLATE_ID = 517113
    
    # 签名,参数使用的是`签名内容`
    SMS_SIGN = "腾讯云"
    

    sms中

    import random
    # 获取六位数数字验证码
    def get_sms_code():
        code = ''
        for i in range(6):
            code += str(random.randint(0,9))
        return code
    
    # 腾讯云短信接口
    from qcloudsms_py import SmsSingleSender
    from .settings import APP_ID, APP_KEY, TEMPLATE_ID, SMS_SIGN
    sender = SmsSingleSender(APP_ID, APP_KEY)
    # 导入日志模块
    from utils.logging import logger
    # 处理短信,发送验证码
    def send_sms(mobile, code, exp):
        try:
            response = sender.send_with_param(86, mobile, TEMPLATE_ID, (code, exp), sign=SMS_SIGN, extend="", ext="")
            # 并不是所有有值的response都是成功的返回
            if response and response.get('result') == 0:
                return True  # 成功
            # 否则记录日志
            logger.error('短信发送失败,状态码:%s,错误信息:%s' % (response.get('result'), response.get('errmsg')))
        except Exception as e:
            logger.error("短信发送异常,异常信息: %s" % e)
    
        return  False
    
    

    __init__

    在包中导入,可以直接引用sms中的方法
    from .sms import get_sms_code, send_sms
    

    2.5 多方式登录

    urls

    from django.urls import path,re_path,include
    from . import views
    # 登录接口路由
    urlpatterns = [
        # 登录接口
        path('login/',views.LoginAPIView.as_view()),
        # 手机验证码登录接口
        path('login/mobile/',views.LoginMobileAPIView.as_view())
    ]
    
    

    views

    import re
    from rest_framework.views import APIView
    from . import serializers
    from utils.response import APIResponse
    
    # 多方式登录
    class LoginAPIView(APIView):
        # 认证权限一定要局部禁用
        authentication_classes = ()
        permission_classes = ()
    
        # 完成登录的数据序列化
        def post(self, request, *args, **kwargs):
            serializer = serializers.LoginModelSerializer(data=request.data)
            serializer.is_valid(raise_exception=True)  # 内部在全局钩子中完成token的签发
            return APIResponse(results={
                'username': serializer.content.get('user').username,
                'token': serializer.content.get('token')
            })
    
    # 手机验证码登录
    class LoginMobileAPIView(APIView):
        authentication_classes = ()
        permission_classes = ()
    
        def post(self, request, *args, **kwargs):
            serializer = serializers.LoginMobileModelSerializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            return APIResponse(results={
                'username': serializer.content.get('user').username,
                'token': serializer.content.get('token')
            })
    
    # 发送验证码
    from libs import tx_sms
    from django.core.cache import cache
    from django.conf import settings
    class SMSAPIView(APIView):
        authentication_classes = ()
        permission_classes = ()
        def post(self, request, *args, **kwargs):
            # 1)处理手机号
            mobile = request.data.get('mobile', None)
            if not mobile:
                return APIResponse(1, msg='mobile字段必须', http_status=400)
    
            if not re.match(r'^1[3-9][0-9]{9}$', mobile):
                return APIResponse(1, msg='mobile格式有误', http_status=400)
    
            # 2) 生成验证码
            code = tx_sms.get_sms_code()
    
            # 3)发送验证码
            result = tx_sms.send_sms(mobile, code, settings.SMS_EXP // 60)
    
            if not result:
                return APIResponse(1, msg='验证码发送失败')
    
            # 4)缓存验证码(cache缓存)
            cache.set(settings.SMS_CACHE_FORMAT % mobile, code, settings.SMS_EXP)
    
            # 5)成功响应
            return APIResponse(0, msg='验证码发送成功')
    
    
    

    serializer

    import re
    from rest_framework import serializers
    from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
    
    
    from . import models
    
    # 序列化多方式登录
    class LoginModelSerializer(serializers.ModelSerializer):
        # post请求,序列化默认当做create动作进行校验,需要校验数据库,create动作username会抛用户已存在异常
        # 抛用户已存在异常是多余的,所以自定义系统校验规则即可
        username = serializers.CharField(min_length=3, max_length=16)
        password = serializers.CharField(min_length=3, max_length=16)
        class Meta:
            model = models.User
            fields = ('username', 'password')
    
        # 用全局钩子,完成token的签发
        def validate(self, attrs):
            # 1)通过 username 和 password 完成多方式登录校验,得到user对象
            user = self._validate_user(attrs)
            # 2)user对象包装payload载荷
            payload = jwt_payload_handler(user)
            # 3)payload载荷签发token
            token = jwt_encode_handler(payload)
            # 4)将user与token存储到serializer对象中,方便在视图类中使用
            self.content = {
                'user': user,
                'token': token
            }
            return attrs
    
        # 校验用户名密码进行多方式登录
        def _validate_user(self, attrs):
            username = attrs.get('username')
            password = attrs.get('password')
    
            if re.match(r'.*@.*', username):  # 邮箱
                user = models.User.objects.filter(email=username).first()  # type: models.User
            elif re.match(r'^1[3-9][0-9]{9}$', username):  # 电话
                user = models.User.objects.filter(mobile=username).first()
            else:  # 用户名
                user = models.User.objects.filter(username=username).first()
    
            if not user or not user.check_password(password):
                raise serializers.ValidationError({'message': '用户信息异常'})
    
            return user
    
    
    # 手机号验证码的序列化
    from django.core.cache import cache
    from django.conf import settings
    class LoginMobileModelSerializer(serializers.ModelSerializer):
        # 手机号与验证码自定义字段
        mobile = serializers.CharField(min_length=11, max_length=11)
        code = serializers.CharField(min_length=6, max_length=6)
        class Meta:
            model = models.User
            fields = ('mobile', 'code')
    
        # 验证码格式内容有误就不需要进行 取服务器存储的验证码(IO操作) 进行校验
        def validate_code(self, value):
            try:
                int(value)
                return value
            except:
                raise serializers.ValidationError('验证码有误')
    
        # 全局校验与后台的验证码校验
        def validate(self, attrs):
            mobile = attrs.get('mobile')
            code = attrs.pop('code')
            # 拿服务器缓存的验证码(将验证定义常量const中)
            old_code = cache.get(settings.SMS_CACHE_FORMAT % mobile)
    
            if code != old_code:
                raise serializers.ValidationError({'code': '验证码有误'})
    
            try:
                user = models.User.objects.get(mobile=mobile, is_active=True)
            except:
                raise serializers.ValidationError({'mobile': '该用户不存在'})
    
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            self.content = {
                'user': user,
                'token': token
            }
            return attrs
    
    

    const

    # 轮播图推荐数
    BANNER_CONST = 3
    
    
    # 短信验证码缓存key
    SMS_CACHE_FORMAT = 'sms_cache_%s'
    
    # 短信过期时间 S
    SMS_EXP = 300
    
  • 相关阅读:
    Ehcache缓存配置和基本使用
    微信公众号接入图灵机器人实现自动回复消息
    数据库索引的使用
    oracle中=>是什么意思
    [转载]AppSettings和ConnectionStrings的区别
    获得字符串长度
    HTML------8.调用接口 实现动态折现图
    HTML------7.编辑折现图
    JAVA------14.今日和昨日时间转换
    JAVA------13.字符串去掉非数字 ,从大到小排序
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12184498.html
Copyright © 2011-2022 走看看