目录
昨日回顾
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
2.luffy项目
2.1 登录相关接口
2.2 注册相关接口
2.3 腾讯云短信api文档
1.创建腾讯云
1、注册开发者账号
2、创建短信应用
3、创建签名与模板
2.添加应用
3.创建签名与模板
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