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

路飞项目day_07

时间:2023-03-03 21:36:13浏览次数:41  
标签:username 短信 07 self 路飞 token user 序列化 day

目录

今日内容详细

一、为开源项目贡献代码

# github,gitee 看到好的开源项目, 发现有bug,为他增加新功能---> 你加入了代码---> 想合并进开源项目,如何做

# 步骤:
	1 先fork开源项目-->复制这个项目到我的仓库中
	2 clone下来,改代码,一路提交到远端(我的)
	3 提交pr,等作者同意

二、pycharm使用git

# 只要用命令操作的,都可以点击完成

image-20230303095408897

image-20230303095542916

image-20230303095614690

image-20230303095712512

image-20230303095927399

image-20230303100202661

image-20230303100341245

image-20230303100439931

image-20230303100555402

image-20230303100649080

三、登录注册功能分析

# 接口分析
	1 多方式登录接口:用户名/手机号/邮箱 +密码都可以登录
	2 发送手机验证码接口   (借助于第三方短信平台)
	3 短信登录接口
	4 注册接口
	5 校验手机号是否存在的接口

四、手机号是否存在

urls.py

from rest_framework.routers import SimpleRouter
from . import views

router = SimpleRouter()
# http://127.0.0.1:8000/api/v1/user/userinfo/send_sms/  get   发送短信
router.register('userinfo',views.UserView,'userinfo')

urlpatterns = [

]
urlpatterns += router.urls

views.py

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=777,msg='手机号不存在')
        return APIResponse(msg='手机号存在')

视图函数模板

    def send_sms(self, request, *args, **kwargs):
        try:
            # 放心大胆写
        except Exception as e:
            raise e
        return APIResponse()

五、多方式登录接口

# 使用  用户名,手机号,邮箱+密码登录

# post--{username:[email protected],password:123}

1.视图类

class UserView(ViewSetMixin, GenericAPIView):
    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')  # ser.context是什么先不着急
        username = ser.context.get('username')
        return APIResponse(token=token, username=username)  # {code:100,msg:成功,token:aasdfa,username:lqz}

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:lqz,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

六、腾讯云短信申请

# 发送短信接口,借助于第三方短信平台,收费的
	-腾讯云短信
	-阿里 大于短信
	-。。。。

# 申请微信公众号:自己搜 实名认证 


# 使用腾讯短信
	-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

补充

# https://gitee.com/aeasringnar/django-RESTfulAPI/tree/master
# https://gitee.com/aeasringnar

标签:username,短信,07,self,路飞,token,user,序列化,day
From: https://www.cnblogs.com/qian-yf/p/17177018.html

相关文章

  • 路飞之登录注册接口
    目录路飞之登录注册接口登录接口视图层多方式登录接口腾讯云短信申请路飞之登录注册接口登录接口接口分析可知,登录注册接口需要五个接口,分别是校验手机号是否存在的接口......
  • day48
    1、leetcode121买卖股票的最佳时机暴力破解,超时classSolution{publicintmaxProfit(int[]prices){intres=0;for(inti=0;i<prices.l......
  • day03(2023.3.2)
    今日份学习:1.字符char2.布尔型boolean 3.运算符算数运算符 4.赋值运算符和扩展赋值运算符 5.关系运算符 6.逻辑运算符 7.位运算 8.字符串 9.......
  • 路飞
    今日内容1.为开源项目贡献代码2.pycharm使用git3.登录注册功能分析4.手机号是否存在接口5.多方式登录接口6.腾讯云短信申请1.为开源项目贡献代码github,gitee看到......
  • 代码随想录算法训练营Day31 贪心算法| 理论基础 455.分发饼干 376. 摆动序列 53. 最
    代码随想录算法训练营理论基础什么是贪心贪心的本质是选择每一阶段的局部最优,从而达到全局最优。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。贪......
  • 路飞-day6——如何为开源项目贡献代码、pycharm使用git、登陆注册功能分析、手机号是
    目录一、如何为开源项目贡献代码二、pycharm使用git1.大前提:先在settings里面把git配上2.克隆代码3新增文件提交到版本库Comparewith:4.gitadd.(把所有工作区内容提......
  • 路飞项目 - 登录注册
    目录1登录注册功能分析2手机号是否存在接口2.1urls.py2.2views.py3多方式登录接口3.1views.py3.2serializers.py1登录注册功能分析①多方式登录接口:用户名、手......
  • python之路81 路飞项目、为开源代码贡献代码、pycharm使用git、登录注册功能分析、手
    为开源项目贡献代码#github,gitee看到好的开源项目,发现有bug,为他增加新功能---》你加入了代码---》想合并进开源项目,如何做#步骤:1先fork开源项目--》复制这......
  • 决战圣地玛丽乔亚Day25-----慢查询优化和索引优化
    建索引的几大原则1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a=1andb=2andc>3andd=4如果......
  • go day200
    结构体变量的赋值点击查看代码packagemainimport"fmt"typeStustruct{ Namestring Ageint}funcmain(){ //方式一:在创建结构体变量时,直接指定字段......