首页 > 其他分享 >路飞

路飞

时间:2023-03-03 20:47:02浏览次数:25  
标签:username 短信 self 路飞 token user 序列化

今日内容

1.为开源项目贡献代码

2.pycharm使用git

3.登录注册功能分析

4.手机号是否存在接口

5.多方式登录接口

6.腾讯云短信申请

1.为开源项目贡献代码

github,gitee 看到好的开源项目,  发现有bug,为他增加新功能---》你加入了代码---》想合并进开源项目,如何做
步骤:
	1 先fork开源项目--》复制这个项目到我的仓库中
    2 clone下来,改代码,一路提交到远端(我的)
    3 提交pr,等作者同意

2.pycharm使用git

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

image

image

image

image

image

image

image

image

image

image

3 登录注册功能分析

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

4.手机号是否存在接口

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

view.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()

5.多方式登录接口

使用  用户名,手机号,邮箱+密码登录
post--{username:[email protected],password:123}

视图类

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}

序列化类

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

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,短信,self,路飞,token,user,序列化
From: https://www.cnblogs.com/yueq43/p/17176899.html

相关文章

  • 路飞-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开源项目--》复制这......
  • 路飞-登录注册功能
    1.注册功能因为路飞项目有很多不同的板块,所以我们分为两个app,一个home用来写主页的功能,一个user用来写用户相关功能。用户注册逻辑我们首先来写手机号是否已注册的接口:us......
  • 路飞项目---day07()
    昨日回顾#GIt内容大回顾#1版本管理软件:git,svn -代码合并-代码版本管理-协同开发,合并代码#2git跟svn区别#3git安装:相应平台软件,下载完成,一路下......
  • 路飞项目day05
    昨日内容回顾#1前端首页#2轮播图接口Banner.vue---->created--->axios--->渲染在页面上v-if#3git介绍-软件,版本管理软件-代码版本管......
  • 路飞1
    后台日志封装日志的作用就是用来记录一些错误信息和操作的,所以我们在以后的项目中都尽量不要出现print了,以后都使用日志logger.info(),以后只需要调整日志级别就好了日......
  • 路飞首页前端
    路飞前台的全局CSS,全局配置文件整理项目App.vue<template><divid="app"><router-view/></div></template>router/index.jsconstroutes=[{pa......
  • 路飞后台
    后台主页模块设计1.首页要写哪些接口轮播图接口推荐课程接口2.创建首页app在apps文件夹下执行python../../manage.pystartapphome3.创建......
  • 路飞
    今日内容1.git多分支2.git远程仓库3.ssh方式连接远程仓库4.协同开发5.冲突解决6.线上分支合并7.远程仓库回滚1.git多分支#为什么要有分支 -可以保证,主分支的版......