首页 > 其他分享 >为开源项目贡献代码-pycharm使用git-登录注册功能分析-判断手机号存在接口-多种方式登录接口-腾讯云短信申请

为开源项目贡献代码-pycharm使用git-登录注册功能分析-判断手机号存在接口-多种方式登录接口-腾讯云短信申请

时间:2023-03-03 20:22:42浏览次数:30  
标签:username git 短信 登录 功能分析 接口 user import

目录

为开源项目贡献代码-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:[email protected],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

标签:username,git,短信,登录,功能分析,接口,user,import
From: https://www.cnblogs.com/zpf1107/p/17176861.html

相关文章