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
posted @ 2020-01-12 20:02  fwzzz  阅读(184)  评论(0编辑  收藏  举报