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

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

时间:2023-03-04 21:11:29浏览次数:39  
标签:username 短信 登录 功能分析 get 接口 token user

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

为开源项目贡献代码

我们在github,gitee 看到好的开源项目,发现有bug或者为他增加新功能,如何做?
# 步骤:
	1 先fork开源项目--》复制这个项目到我的仓库中
    2 clone下来,改代码,一路提交到远端(我的)
       git clone xxxx
       git push origin master
    3 提交pr,等作者同意

image

image

pycharm使用git

	pycharm也能够使用git来操作一系列的命令,比在Git上面敲命令要简单方便的多,操作简洁方便容易。

image

image

image

image

image

image

登录注册功能分析

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

手机号是否存在接口

视图函数模版

    def send_sms(self, request, *args, **kwargs):
        try:
            # 放心大胆写
        except Exception as e:
            raise e
        return APIResponse()
零碎的知识点:
1.写继承类的时候,不要写ModelViewSet,因为它不需要验证就能够添加用户,漏洞太大了,不安全
url.py:
from rest_framework.routers import SimpleRouter
from . import views

router = SimpleRouter()
router.register('userinfo',views.UserView,'userinfo')
urlpatterns = [

]
urlpatterns += router.urls
class UserView(GenericViewSet):


    @action(methods=['GET'],detail=False)
    def send_sms(self,request,*args,**kwargs):
        try:
            mobile = request.query_params.get('mobile')
            print(1)
            User.objects.get(mobile=mobile)
        except Exception as e:
            raise e
        return APIResponse(msg='手机号存在')

image

多方式登录接口

视图类

class UserView(GenericViewSet):
    queryset = User.objects.all().filter(is_active=True)
    serializer_class = UserLoginSerializer

    @action(methods=['GET'],detail=False)
    def send_sms(self,request,*args,**kwargs):
        try:
            mobile = request.query_params.get('mobile')
            print(1)
            User.objects.get(mobile=mobile)
        except Exception as e:
            raise e
        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 = UserLoginSerializer   两种方法都是可以的,这种方法只是为了让pychram提示
        # 执行这句话,会走字段自己的校验,局部钩子,全局钩子
        # raise_exception就是在校验失败的时候报错的作用
        ser.is_valid(raise_exception=True)
        token = ser.context.get('token')
        username = ser.context.get('username')
        return APIResponse(token=token,username=username)

序列化类


from rest_framework import serializers
from .models import User
import re
from rest_framework.exceptions import APIException
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 = serializers.CharField()
    '''
        这里需要我们重新定义字段自己的校验
        否则就会因为用户表中定义的时候,规定的唯一限制导致报错
        unique=True
    '''
    class Meta:
        model = User
        fields = ['username', 'password']

    def validate(self, attrs):
        '''
              这里我们使用把校验逻辑放在序列化类中的方式实现多方式的登陆接口
              1、取出前端传入的用户名和密码
              2、通过用户名和密码去数据库查询对象
              3、如果能查到,签发token
              4、返回数据给前端
        '''
        user = self._get_user(attrs)
        token = self._get_token(user)

        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'^[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

image

腾讯云短信申请

# 发送短信接口,借助于第三方短信平台,收费的
	-腾讯云短信
    -阿里 大于短信
      
# 申请微信公众号:自己搜 要实名认证 

# 使用腾讯短信
	-https://cloud.tencent.com,微信扫码登录
    -搜索短信:https://console.cloud.tencent.com/smsv2
    - 创建短信签名:公众号注册,提交等待审核
	- 创建短信正文模版
	-等待审核
	-发送短信
    	python 代码法搜昂短信
当前面两项申请成功后,我们就可以根据他提供的教程发送短信了
有API和SDK两种方式
# API SDK
	-API: 咱们学习过的API接口,写起来比较麻烦,自己分析接口
    
    -SDK:集成开发工具包,分语言,java,python,go
    	-使用python 对api进行封装成包
        -以后我们只需要,安装包,导入包,包名.发送短信,传入参数,就可以发送了
    

   - 只要官方提供sdk,优先用sdk
		pip install tencentcloud-sdk-python

标签:username,短信,登录,功能分析,get,接口,token,user
From: https://www.cnblogs.com/zx0524/p/17179135.html

相关文章