Luffy项目

一、如何为开源项目贡献代码

步骤:

不管是gitee还是gitbup上面开源出来的代码,都可以直接clone到自己的电脑上。在使用别人开源代码的时候,如果有自己不错的想法,或是发现了bug可以联系作者,进行贡献代码

1、先fork开源项目----》复制到自己的仓库中
2、clone下来,改代码,然后提交到自己的远程仓库
3、提交pr,并说明情况,等待作者同意

二、pycharm操作Git

一、配置Settings

img

二、基本使用

Luffy项目:4、为开源项目贡献代码,pycharm操作Git,Luffy项目登录/注册功能分析,腾讯云短信申请-小白菜博客

三、Luffy项目登录/注册功能分析

登录接口分析:

  • 常规登录:

    • 多方式登录接口(用户名/手机号/邮箱+密码)
  • 短信登录:

    • 校验手机号是否存在
    • 发送手机验证码(借助第三方平台发送短信)

1、验证手机号是否存在接口

思路:

  • 1、路由分发
  • 2、使用CBV、rest_framework框架,继承GenericViewSet
  • 3、使用action装饰器,映射路由
  • 4、前端GET请求,获取GET请求携带的参数,数据库中查询
  • 5、根据查询结果反馈api接口信息

views.py

class UserView(GenericViewSet):

    # 查询手机号是否存在接口
    @action(methods=['GET'], detail=False)
    def send_sms(self, request, *args, **kwargs):
        print(123)
        # 获取GET请求携带的mobile(手机号)
        mobile = request.query_params.get('mobile')
        try:
            # 根据手机号到数据库查询
            User.objects.get(mobile=mobile)
        # get方法查询不到就会报错(报错了就说明不存在该手机号)
        except Exception:
            # 走到这里说明手机号不存在
            return APIResponse(result='手机号不存在')
        # 走到这里就说明手机号存在(正常返回结果)
        return APIResponse(result='手机号存在')

urls.py

from rest_framework.routers import SimpleRouter
from user import views

router = SimpleRouter()
router.register('userinfo', views.UserView, 'user')
urlpatterns = [
]
urlpatterns += router.urls

2、多功能登录接口

思路:

  • 1、POST请求

  • 2、请求体携带参数

    • 用户名(username):携带的可能是手机号或邮箱或用户名
    • 密码(passowrd):携带密码
  • 3、使用序列化类,在序列化类中进行逻辑判断(查询用户),签发token

views.py

from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
from .models import User
from utils.common_response import APIResponse
from .UserLoginSerializers import UserLoginSerializer


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

    # 登录接口
    @action(methods=['POST'], detail=False)
    def login(self, request, *args, **kwargs):
        # 执行序列化类
        ser = self.get_serializer(data=request.data)
        # 执行校验(字段校验,全局钩子)
        ser.is_valid(raise_exception=True)
        # 校验通过,获取user和token
        username = ser.context.get('user')
        token = ser.context.get('token')
        # 将数据返回给前端
        return APIResponse(msg='登录成功', username=username, token=token)

UserLoginSerializers.py

from rest_framework import serializers
from rest_framework.exceptions import APIException
from user.models import User
from user.common_jwt import jwt_encode
import re


class UserLoginSerializer(serializers.ModelSerializer):
    username = serializers.CharField()

    class Meta:
        model = User
        fields = ['username', 'password']

    # 全局钩子,校验用户是否存在
    def validate(self, attrs):
        # 写一个函数,专门用来校验登录
        user = self._get_user(attrs)
        # 走到这里说明用户校验通过,开始签发token
        token = jwt_encode(user)
        self.context['user'] = user.username
        self.context['token'] = token
        return attrs

    def _get_user(self, attrs):
        # 获取用户输入
        username = attrs.get('username')
        password = attrs.get('password')
        # 先默认为用户名进行校验
        try:
            # 取不到会走下方的异常
            user = User.objects.get(username=username)
        # 这里根据用户输入再次进行校验
        except:
            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()
        if user:
            user.check_password(password)
            return user
        raise APIException('用户名或密码错误')

jwt.py

import datetime
from rest_framework_jwt.settings import api_settings

jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER


def jwt_payload(user_obj):
    return {
        'user_id': user_obj.pk,
        'username': user_obj.username,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)
    }


# 签发
def jwt_encode(user_obj):
    # 获取荷载
    payload = jwt_payload(user_obj)
    # 参数完整jwt签名
    token = jwt_encode_handler(payload)
    return token

四、腾讯云短信申请

1、申请微信公众号

网页搜索微信公众号平台:https://mp.weixin.qq.com/

申请步骤:

  • 1、点击订阅号
  • 2、按照要求输入,提交
  • 3、选择账号类型:订阅号
  • 4、主体类型:个人
  • 5、创建成功之后,更换头像和名称(刚注册成功之后,三天内名称不换则自动注销)

img

img

2、进入腾讯云创建签名管理和模板

网页搜索腾迅云官网

操作步骤:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述