day07
内容概要
- 为开源项目贡献代码
- pycharm使用git
- 登录注册功能分析
- 手机号是否存在
- 多方式登录接口
- 腾讯云短信申请
为开源项目贡献代码
github,gitee 看到好的项目,发现有bug,为他增加新功能
---》你加入了代码---》想合并进开源项目,如何做
步骤
- 先fork开源项目--》复制这个项目到我的仓库中
- clone下来,改代码,一路提交到远端, 因为是先复制到我的仓库,然后从我的仓库拉下来的,所以这次提交是提交到我的仓库上面
- 去开源项目上 提交pr 等待作者同意
pycharm使用git



登陆注册
接口分析
- 校验手机号是否存在
- 多方式登录接口:用户名/手机号/邮箱 + 密码
- 发送手机验证码接口(借助第三方短信)
- 注册接口
序列化层
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})

浙公网安备 33010602011771号