day07

内容概要

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

为开源项目贡献代码

github,gitee 看到好的项目,发现有bug,为他增加新功能

---》你加入了代码---》想合并进开源项目,如何做

步骤

  1. 先fork开源项目--》复制这个项目到我的仓库中
  2. clone下来,改代码,一路提交到远端, 因为是先复制到我的仓库,然后从我的仓库拉下来的,所以这次提交是提交到我的仓库上面
  3. 去开源项目上 提交pr 等待作者同意

pycharm使用git

image-20230303210118747

image-20230303210227836

image-20230303210711872

登陆注册

接口分析

  1. 校验手机号是否存在
  2. 多方式登录接口:用户名/手机号/邮箱 + 密码
  3. 发送手机验证码接口(借助第三方短信)
  4. 注册接口

序列化层

import re
from .models import User
from rest_framework.exceptions import APIException
from rest_framework import serializers
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 UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField()

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

    def validate(self, attrs):
        password = attrs.get("password")
        user = self._get_user(attrs)
        if not user.check_password(password):
            raise APIException("密码错误")
        # 签发token
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)
        self.context["username"] = user.username
        self.context["token"] = token
        return attrs

    def _get_user(self, attrs):
        username = attrs.get("username")
        # 用户名
        #   手机号   正则表达式                        待匹配的字符串
        if re.match("0?(13|14|15|17|18|19)[0-9]{9}", username):
            user = User.objects.filter(mobile=username).first()
        # 邮箱
        elif re.match("\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}", username):
            user = User.objects.filter(email=username).first()
        else:
            user = User.objects.filter(username=username).first()
        if user:
            return user
        raise APIException("用户名不存在")

视图层

class UserView(GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_serializer_class(self):
        # print(self.action, "我是action")  # 只要你继承了ViewSetMixin那么就会有对象就会有action属性,热这个属性就是执行的方法名
        if self.action == "login":
            return super().get_serializer_class()
        elif self.action == "mobile_login":
            return MobilSerializer
        elif self.action == "register":
            return RegisterSerializer

    @action(methods=["POST"], detail=False)
    def login(self, request):
        res = self.get_serializer(data=request.data)
        res.is_valid(raise_exception=True)
        # 避免数据被污染
        username = res.context.get("username")
        token = res.context.get("token")
        return APIResponse(msg="登录成功", data={"username": username, "token": token})
posted @ 2023-03-07 00:15  可否  阅读(20)  评论(0)    收藏  举报