为开源项目贡献代码-pycharm使用git-登录注册功能分析-判断手机号存在接口-多种方式登录接口-腾讯云短信申请
2024-09-08 16:29:36
目录
为开源项目贡献代码-pycharm使用git-登录注册功能分析-判断手机号存在接口-多种方式登录接口-腾讯云短信申请
git内容大回顾
# 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 dev # 删除分支
git merge dev # 合并分支---> 在status分支下使用 将dev合并到status
# 9 远程仓库(gitee)
远程:创建空仓库
本地:
git init
git add
git commit
# 添加远程仓库
git remote add origin 地址(ssh/http)
# 删除远程仓库
git remote remove origin
# 查看远程仓库
git remote
git push origin master # 上传代码 http需要输入用户名密码
git pull origin master # 拉取代码 每次提交代码先拉取
# 10 git clone 地址
作为开发者 要把项目从远程仓库克隆下来进行开发
git clone 开源项目 # 没有任何阻碍
# 11 ssh操作远程仓库
公钥私钥
公钥配置在gitee上 以后使用ssh推送代码 就不需要验证
git remote add origin 地址(ssh)
# 12 冲突解决(面试)
多人在同一分支开发
分支合并
# 13 线上分支合并
提交pr
# 需要记住的重点命令
git add
git commit -m
git pull origin dev
git push origin dev
今日内容概要
1 为开源项目贡献代码
2 pycharm使用git
- 2.1 先配置pycharm使用git
3 登录注册功能分析
4 手机号是否存在接口
- 4.2 视图函数模板
5 多方式登录接口
- 5.1 视图类
- 5.2 序列化类
6 腾讯云短信申请
今日内容详细
1 为开源项目贡献代码
# github gitee 看到好的开源项目 发现有bug 为他增加新功能---> 你加入了代码---> 想合并进开源项目 如何做
# 步骤:
1 先fork开源项目---> 复制这个项目到我的仓库中
2 clone下来 改代码 一路提交到远端(我的仓库)
3 提交pr 等作者同意
2 pycharm使用git
# 只要用命令操作的 都可以点击完成
2.1 先配置pycharm使用git
3 登录注册功能分析
# 接口分析
校验手机号是否存在的接口
多方式登录接口:用户名/手机号/邮箱 +密码都可以登录
发送手机验证码接口 (借助于第三方短信平台)
短信登录接口
注册接口
4 手机号是否存在接口
views
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
from .models import User
from utils.common_response import APIResponse
class UserView(GenericViewSet):
@action(methods=['GET'], detail=False) # 保证这个接口的安全
def send_sms(self, request, *args, **kwargs):
try:
# 从地址栏中取出手机号 query_params: 拿出的是queryDict
mobile = request.query_params['mobile']
User.objects.get(mobile=mobile)
except Exception as e:
raise e
# return APIResponse(code=788, msg='手机号不存在')
return APIResponse(msg='手机号存在')
urls
# 总路由
path('api/v1/home/', include('home.urls'))
# 分路由
from rest_framework.routers import SimpleRouter
from home import views
router = SimpleRouter()
router.register('userinfo', views.UserView, 'userinfo')
urlpatterns = [
]
urlpatterns += router.urls
4.2 视图函数模板
def send_sms(self, request, *args, **kwargs):
try:
# 放心大胆写
except Exception as e:
raise e
return APIResponse()
5 多方式登录接口
# 使用 用户名 手机号 邮箱 + 密码登录
# post---> {username:3@qq.com,password:123}
5.1 视图类
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
from utils.common_response import APIResponse
from .home_serializer import UserLoginSerializer
from .models import User
class UserView(GenericViewSet):
serializer_class = UserLoginSerializer
queryset = User.objects.filter(is_active=True)
@action(methods=['GET'], detail=False) # 保证这个接口的安全
def send_sms(self, request, *args, **kwargs):
try:
# 从地址栏中取出手机号 query_params: 拿出的是queryDict
mobile = request.query_params['mobile']
User.objects.get(mobile=mobile)
except Exception as e:
raise e
# return APIResponse(code=788, msg='手机号不存在')
return APIResponse(msg='手机号存在')
@action(methods=['POST'], detail=False)
def login_mul(self, request, *args, **kwargs):
# 实例化 序列化对象 可以传入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) # {code:100,msg:成功,token:aasdfa,username:lqz}
5.2 序列化类
import re
from rest_framework import serializers
from .models import User
from utils.common_response import APIResponse
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):
# attrs是前端传入的数据 经过字段自己校验和局部钩子校验过后的数据 {username:lqz,password:123}
'''
把这个逻辑放在序列化类中
1 取出前端传入的用户名和密码
2 通过用户名和密码去数据库查询用户
3 如果能查到 签发token
4 返回给前端登录成功
'''
user = self._get_user(attrs)
token = self._get_token(user)
# 把用户名和token放到user的 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:
# 用户不存在或密码错误 这里的代码 还是在全局钩子中执行 全局钩子校验失败 要抛异常
return APIResponse('用户不存在或密码错误')
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
最新文章
- D3中selection之使用
- 0421 &; SX2016
- Spring MVC和Struts2的比较的优点
- linux服务器重启服务命令说明文档
- The version of CocoaPods used to generate the lockfile (*) is higher than the version of the current executable (*). Incompatibility issues may arise.
- Duanxx的STM32学习: STM32的存储映射
- 从一句SQL得出的启示
- div光标定位问题总结
- Linux 排除问题的前5分钟
- The Windows account sa does not exist and cannot be provisioned as a SQL Server system administrator
- Kali Linux NetHunter教程Kali NetHunter支持的设备和ROMs
- python之使用set对列表去重,并保持列表原来顺序(转)
- CHKDSK/f
- Hadoop开发第2期---虚拟机中搭建Linux
- 用Java检测远程主机是否能被连接
- backreference Oracle正則表達式中的反向引用
- 洛谷P1782 旅行商的背包
- Android获取文件的MD5值
- 学习Mysql的记录贴 记录的内容是 指令的试用
- elasticsearch -- 问题纪录
热门文章
- Laravel 刚创建的项目 API 无法使用 Session,是没有在Api的请求内开启Session
- P8_组件-view和scroll-view组件的基本用法
- 运行第一个Go文件
- Rpc-实现Zookeeper注册中心
- react中Hooks的理解和用法
- 【Oculus Interaction SDK】(十二)Meta Quest 如何开启透视(Passthrough)
- Cobalt Strike 之:域内渗透
- 代码随想录算法训练营day21 | leetcode ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● ***236. 二叉树的最近公共祖先
- XMLHttpRequest、Ajax、Fetch与Axios
- 【C#异步】异步多线程的本质,上下文流转和同步