首页 > 其他分享 >路飞项目day06

路飞项目day06

时间:2023-03-06 23:55:32浏览次数:38  
标签:username git 短信 项目 day06 路飞 token user 序列化

昨日内容回顾

# 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

image-20230306162818924

image-20230306162911748

image-20230306162953448

image-20230306163043048

image-20230306163130469

image-20230303095927399

image-20230303100341245

image-20230303100439931

image-20230303100555402

image-20230303100649080

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

image-20230306211222223

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='手机号存在')

image-20230306211341890

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)

image-20230306234412932

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

image-20230306234519157

image-20230306234529134

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

相关文章

  • 路飞项目----day08()
    上节回顾#1git回顾#2pycharm操作git -版权---》收费软件---vscode,社区版vim搭建开发环境-项目右键---》git---》很多操作,之前使用命令的,现在都可以通过点......
  • Spring Cloud Alibaba项目搭建
    一、简介作为微服务的解决方案之一的SpringcloudAlibaba拥有众多优秀的开源框架,那么我们就使用这么框架搭建一个项目,并以此来研究一下这些优秀框架的源码。所使用到......
  • python之路82 路飞项目、腾讯云短信开发、短信验证接口、短信登录接口、短信注册接口
    腾讯云短信开发前期准备工作:使用腾讯短信https://cloud.tencent.com,微信扫码登录搜索短信:https://console.cloud.tencent.com/smsv2创建短信签名:公......
  • nginx部署前端项目-location root与 alias区别
    1、locationroot:/path/uri(把匹配的路径追加到配置的路径:/demoProject追加到/usr/local/nginx/front/apps/demo)/demoProject{root/usr/local/nginx......
  • Vue 项目配置文件中的 devServer
    Web项目部署时,会将前端和后端打包好放到服务器中。比如将Vue项目和SpringBoot项目打包好放到Tomcat中。然后浏览器通过HTTP等协议从服务器获取HTML、JS、CSS等......
  • 路飞-day7——腾讯云短信开发、短信验证码接口、短信登陆接口、短信注册接口
    目录一、腾讯云短信开发1.1SDK安装操作流程1.2发送短信1.3封装发送短信功能二、短信验证码接口三、短信登录接口3.1视图类4.2序列化类四、短信注册接口4.1路由4.2视图......
  • 【MRTK】HoloLens 项目部署的几种方法
    前言如果在项目部署过程中遇到报错Unity.IL2CPP.Building.BuilderFailedException:Lump_libil2cpp_vm.cpp,可以查看我之前的文章【MRTK】解决Unity.IL2CPP.Building.Bu......
  • 项目中怎么实现分库分表
    当单表行数超过500W行或者单表数据容量超过2G时,就会对查询性能产生较大影响,这个时候建议对表进行优化。其实500W数据只是一个折中的值,具体的数据量和数据库服务器配置......
  • Solon2 项目整合 Nacos 配置中心
    网上关于Nacos的使用介绍已经很多了,尤其是与SpringBoot的整合使用。怎么安装也跳过了,主要就讲Nacos在Solon里的使用,这个网上几乎是没有的。1、认识SolonSolon......
  • springboot项目jar包混淆加密
    混淆工具jar包混淆工具挺多的,实现原理不尽相同,这里使用的classfinal加密执行以下命令java-jarclassfinal-fatjar.jar-fileyourproject.jar-libjarsa.jar,b.jar-......