Luffy项目:4、为开源项目贡献代码,pycharm操作Git,Luffy项目登录/注册功能分析,腾讯云短信申请
目录
Luffy项目
一、如何为开源项目贡献代码
步骤:
不管是gitee还是gitbup上面开源出来的代码,都可以直接clone到自己的电脑上。在使用别人开源代码的时候,如果有自己不错的想法,或是发现了bug可以联系作者,进行贡献代码
1、先fork开源项目----》复制到自己的仓库中
2、clone下来,改代码,然后提交到自己的远程仓库
3、提交pr,并说明情况,等待作者同意
二、pycharm操作Git
一、配置Settings
二、基本使用
三、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、创建成功之后,更换头像和名称(刚注册成功之后,三天内名称不换则自动注销)
2、进入腾讯云创建签名管理和模板
网页搜索腾迅云官网
操作步骤:
-
1、进入后,输入框内搜索:短信 ,点击免费
-
2、申请签名管理(需要改名字审核通过了才行)
-
3、创建正文模板
-
4、通过官方文档使用:https://cloud.tencent.com/document/product/382/43194