昨日内容回顾
# git内容大回顾
# 1 版本管理软件:git,svn
-代码合并
-代码版本管理
-协同开发,合并代码
# 2 git和svn的区别
# 3 git 安装:响应平台软件,下载完成,一路下一步---》命令:git
# 4 git,gitlab,gitee,github,bitbucket
# 5 git 工作流程
-工作区
-暂存区
-版本库
-远程仓库
# 6 git 常用命令
-git init 名字 # .git 隐藏
-git status
-git add
-git commit -m
-git reset --hard 版本号
-git log
-git reflog
-设置用户名(全局和局部)
git config --global user.name '用户名'
# 7 git 忽略文件
.gitignore
# 8 分支管理
-查看:git branch
-git branch dev
-git checkout dev
-git branch -d dev
-合并分支:git -d dev
# 9 远程仓库(gitee)
-远程:创建仓库,空仓库
-本地:
git init
git add
git commit
# 添加远程仓库
git remote add origin 地址(ssh/http)
# 删除远程仓库
git remote remove origin
# 查看远程仓库
git remote
git push origin master # 需要输入用户名密码
git pull origin master # 每次提交代码之前先拉
# 10 git clone 地址
-你是开发者,项目已经有了,你需要克隆下来
git clone 开源项目 # 没有任何阻碍
# 11 ssh操作远程仓库
-公钥私钥
-公钥配置在gitee上,以后使用ssh推送代码,就不需要验证
-git remote add origin 地址(ssh)
# 12 冲突(面试)
-多人在同一分支开发
-分支开发
# 13 线上分支合并
-提交pr
# 14 远程仓库回滚(忘掉)
# 记住的
git add
git commit -m
git pull origin dev
git push origin dev
今日内容
-
为开源项目贡献代码
-
pycharm使用git
-
登录注册功能分析
-
手机号是否存在接口
-
多方式登陆接口
-
腾讯云短信申请
1 为开源代码贡献代码
# github,gitee 看到好的开源项目,发现有bug,为他增加新功能---》你加入了代码---》想合并进开源项目,如何做
# 步骤:
1 先fork开源项目---》复制这个项目到我的仓库中
2 clone下来,改代码,一路提交到远端(我的)
3 提交pr,等作者同意
2 pycharm使用git
只要用命令操作的,都可以点击完成
2.1 先配置pycharm使用git
3 登陆注册功能分析
# 接口分析
1 校验手机号是否存在的接口
2 多方式登录接口:用户名/手机号/邮箱+密码都可以登录
3 发送手机验证码接口 (借助于第三方短信平台)
4 短信登录接口
5 注册接口
4 手机号是否存在接口
4.1 路由层
from rest_framework.routers import SimpleRouter
from . import views
router = SimpleRouter()
# http://127.0.0.1:8000/api/v1/user/userinfo/send_sms/?mobile=... get 发送短信
router.register('userinfo', views.UserView, 'userinfo')
urlpatterns = [
]
urlpatterns += router.urls
4.2 视图层
# 手机号是否存在接口
# 自动生成路由
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
from utils.common_response import APIResponse
from .models import User
from rest_framework.exceptions import APIException
# 老版本代码
# class UserView(GenericViewSet):
# @action(methods='GET', detail=False) # 保证这个接口的安全(短信轰炸机---》解析出了好多网站的发送短信接口,用多线程)
# def send_sms(self, request, *args, **kwargs):
# # 从地址栏中取出手机号
# mobile = request.query_params.get('mobile')
# if mobile:
# user = User.objects.filter(mobile=mobile).first()
# if user:
# return APIResponse(code=100, msg='手机号存在', exist=True)
# else:
# return APIResponse(code=100,msg='手机号不存在',exist=False)
# else:
# return APIResponse(code=999, msg='手机号必填')
# 新版本代码
class UserView(GenericViewSet):
@action(methods=['GET'], detail=False) # 保证这个接口的安全(短信轰炸机---》解析出了好多网站的发送短信接口,用多线程)
def send_sms(self, request, *args, **kwargs):
try:
# 从地址栏中取出手机号
mobile = request.query_params['mobile']
# 有且只有一条,才不报错,否则报错
User.objects.get(mobile=mobile)
except Exception as e:
raise e
# return APIResponse(code=777,msg='手机号不存在')
return APIResponse(msg='手机号存在')
4.3 视图函数模版
def send_sms(self, request, *args, **kwargs):
try:
# 放心大胆写
except Exception as e:
raise e
return APIResponse()
5 多方式登录接口
# 使用 用户名,手机号,邮箱+密码登录
# post--{username:[email protected],password:123}
5.1 视图类
class UserView(GenericViewSet):
serializer_class = UserLoginSerializer
queryset = User.objects.all().filter(is_active=True)
@action(methods=['POST'], detail=False)
def login_mul(self, request, *args, **kwargs):
'''
把这个逻辑放在序列化类中
1 取出前端传入的用户名和密码
2 通过用户和密码去数据库查询用户
3 如果能查到 签发token
4 返回给前端登陆成功
'''
# 实例化 序列化类对象时 可以传入context 字典 context(上下文)是视图类和序列化类沟通的桥梁
# 序列化类对象,放入的
# 有了序列化对象,通过 对象.context就可以拿到值
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)
5.2 序列化类
from .models import User
from rest_framework import serializers
import re
from rest_framework.exceptions import APIException, ValidationError
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 这个序列化类用来校验字段---不做序列化,也不做反序列化
class UserLoginSerializer(serializers.ModelSerializer):
# 坑
# 重写username,把原来的校验规则去掉
username = serializers.CharField()
class Meta:
model = User
# username 映射过来,是唯一的,字段自己的校验就过不了
fields = ['username', 'password'] # 这个序列化类用来校验字段---不做序列化,也不做反序列化
# 全局钩子
def validate(self, attrs):
'''
把这个逻辑放在序列化类中
1 取出前端传入的用户名和密码
2 通过用户和密码去数据库查询用户
3 如果能查到 签发token
4 返回给前端登陆成功
'''
# attrs 是前端传入的数据,经过 字段自己的校验和局部钩子校验过后的数据 {username:zyl,password:123}
user = self._get_user(attrs)
token = self._get_token(user)
# 把用户名,和token放到ser的context中
self.context['token'] = token
self.context['username'] = user.username
return attrs
# 在类内部,隐藏属性和方法, __开头
# 公司里约定俗成,不用__,使用_,表示不想给外部用,但是实在响用,根据名字直接用
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(mobile=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('用户不存在或密码错误')
def _get_token(self, user):
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
6 腾讯云短信申请
# 发送短信接口,借助于第三方短信平台,收费的
-腾讯云短信
-阿里 大于短信
-。。。。
# 申请微信公众号:自己搜 实名认证
# 使用腾讯短信
-https://cloud.tencent.com,微信扫码登录
-搜索短信:https://console.cloud.tencent.com/smsv2
- 创建短信签名:公众号注册,提交等待审核
- 创建短信正文模版
-等待审核
-发送短信
python 代码法搜昂短信
# API SDK
-API: 咱们学习过的API接口,写起来比较麻烦,自己分析接口
-SDK:集成开发工具包,分语言,java,python,go
-使用python 对api进行封装成包
-以后我们只需要,安装包,导入包,包名.发送短信,传入参数,就可以发送了
- 只要官方提供sdk,优先用sdk
pip install tencentcloud-sdk-python
标签:username,git,短信,项目,day06,路飞,token,user,序列化
From: https://www.cnblogs.com/super-xz/p/17185997.html