为开源项目共享代码

步骤:
1先fork开源项目
2clone下来,修改代码,进行提交
3提交pr,等作者同意

Pycharm 使用Git

右键文件会列出Git命令

登录注册功能分析

多方式登录接口:用户名/手机号/邮箱 + 密码都可以登陆

发送手机验证码接口 (借助于第三方短信平台)

短信登录接口

注册接口

手机号是否存在接口

校验手机号是否存在

user/urls.py

路由层
from django.urls import path, include
from rest_framework.routers import SimpleRouter
from . import views router = SimpleRouter()
router.register('user',views.UserView,'user')
urlpatterns = [
path('',include(router.urls)) //
]
# urlpatterns += router.urls

user/views.py

from rest_framework.viewsets import ViewSet
from rest_framework.exceptions import APIException
from rest_framework.decorators import action
from utils.response import APIResponse
from .models import UserInfo
class UserView(ViewSet):
@action(methods=['get'], detail=False)
def check_mobile(self, request):
try:
# 如果布报错就说明手机号存在
mobile = request.query_params.get('mobile')
UserInfo.objects.get(mobile=mobile)
return APIResponse('手机号存在')
except Exception as e:
# raise e 也可以直接返抛出异常,就可以被全局异常捕获到
raise APIException('手机号不存在!')

视图函数模板

from restframework.response import APIresponse
def send_sms(self, request, *args, **kwargs):
try:
# 放心大胆写
except Exception as e:
raise e
return APIResponse()

多方式登录接口

使用用户名/手机号/邮箱+密码登录

发送post请求到后端{"username":"xxx","password":"123"}

# 登录逻辑
1取出前端传入的用户名和密码
2通过用户名和密码去数据库查询
3查到了,签发token
4返回前端 将逻辑放入序列化类中..

视图类

  • ser_obj.context >> 序列化类与视图类沟通的桥梁(本质上是个字典)
from rest_framework.viewsets import ViewSet
from .serializer import UserMulLoginSerializer, MobileLoginSerializer
from rest_framework.decorators import action
from utils.response import APIResponse
from .models import UserInfo
class UserView(ViewSet):
@action(methods=['post'], detail=False, )
def login(self, request):
return self.common_login() def _get_serializer(self, data): # 因为我们有短信登录和多方式登录,可以将序列化类封装到函数中通过判断获取
# 判断请求方式返回不同的序列化类
res = self.request.META.get('PATH_INFO')
# PATH_INFO 可以拿到请求的路径信息
if res == '/api/v1/userinfo/user/mobile_login/':
return MobileLoginSerializer(data=data)
return UserMulLoginSerializer(data=data) def common_login(self):
ser_obj = self._get_serializer(data=self.request.data)
# 执行这句话,会走字段自己的校验,局部钩子,全局钩子
ser_obj.is_valid(raise_exception=True)
token = ser_obj.context.get('token')
# 有了序列化类对象,通过 对象.context 就可以拿到值
icon = ser_obj.context.get('icon')
username = ser_obj.context.get('username')
return APIResponse(token=token, icon=icon, username=username)

序列化类

from rest_framework import serializers
from .models import UserInfo
from utils.common_serializer import Verification class UserMulLoginSerializer(serializers.ModelSerializer, Verification):
# 全局钩子中有很多重复代码,我们直接将其封装到 (多方式登录和手机登录都可以使用)
# utils目录下的common_serializer.py中
username = serializers.CharField()
# 由于序列化类校验时会先走字段自己的校验,Mobile字段我们又设置了unique=True属性
# 所以如果我们请求来到了字段自己的校验就不会通过,我们需要重写该字段 class Meta:
model = UserInfo
fields = ['username', 'password'] def validate(self, attrs):
attrs = self._validate(attrs)
return attrs # 全局钩子必须返回校验后的数据
如果没有通过序列化类的校验,需抛出异常
我们又封装了全局捕获异常,所以就直接抛出即可

utils/common_serializer/Verification

import re
from django.contrib.auth import authenticate
from rest_framework.exceptions import ValidationError,APIException
from django.core.cache import cache
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
from user.models import UserInfo
class Verification():
def _get_token(self, user_obj):
pay_load = jwt_payload_handler(user_obj)
token = jwt_encode_handler(pay_load)
return token
def _validate(self,attrs):
user_obj = self._get_user(attrs)
token = self._get_token(user_obj)
self.context['token'] = token # self 是 序列化类对象 所以可以点context传值进去
self.context['username'] = user_obj.username
self.context['icon'] = 'http://127.0.0.1:8000/media/' + str(user_obj.icon)
return attrs
def _get_user(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
mobile = attrs.get('mobile')
if mobile:
if not re.match(r'^1[3-9][0-9]{9}$', mobile):
raise ValidationError('手机号格式输入错误')
code = attrs.get('code')
old_code = cache.get('sms_code_%s' % mobile)
if code == old_code:
return UserInfo.objects.filter(mobile=mobile).first()
raise APIException('验证码错误') if re.match(r'^1[3-9][0-9]{9}$', username):
user_obj = UserInfo.objects.filter(mobile=username).first()
if user_obj.check_password(password) and user_obj:
return user_obj
raise ValidationError('用户名或密码错误')
# user_obj = authenticate(mobile=username, password=password)
elif re.match(r'^.+@.+$', username):
user_obj = authenticate(email=username, password=password)
else:
user_obj = authenticate(username=username, password=password)
if not user_obj:
raise ValidationError('用户名或密码错误')
return user_obj

腾讯云短信申请

  • 发送短信接口,借助于第三方短信平台

我们在使用云短信前需要自己申请Vx公众号(个人的即可)

  • 使用腾讯短信

微信扫码登录

  • 搜索短信:
  • 创建短信签名:公众号注册,提交等待审核
  • 创建短信正文模版
  • 等待审核
  • 发送短信(api接口 SDK)

API: 咱们学习过的API接口,写起来比较麻烦,自己分析接口,对上即可

SDK:集成开发工具包,分语言,java,python,go

使用python 对api进行封装成包

以后我们只需要,安装包,导入包,包名.发送短信,传入参数,就可以发送了

pip install tencentcloud-sdk-python

Python实战项目6-后端多方式登录接口/手机登录接口的更多相关文章

  1. 再一波Python实战项目列表

    前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...

  2. Python实战项目网络爬虫 之 爬取小说吧小说正文

    本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...

  3. Python实战---制作专属有声小说(调用百度语音合成接口)

    这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来. 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调 ...

  4. python实战项目

    没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用到实际开发中更是不得而知了! 以上就是我们在学习过程中必须要有项目实战开发经验的原因,其实无论项 ...

  5. python实战项目练习-Django商城项目之注册功能实现

    设计到的前端知识 项目的前端页面使用vue来实现局部刷新,通过数据的双向绑定实现与用户的交互,下面来看一下需求,在用户输入内容后,前端需要做一些简单的规则校验,我们希望在在用户输入后能够实时检测,如果 ...

  6. python实战项目 — selenium登陆豆瓣

    利用selenium 模仿浏览器,登陆豆瓣 重点: 1. 要设置好 chromedriver配置与使用, chromedriver.exe 和 Chrome的浏览器版本要对应, http://chro ...

  7. 7 个有趣的 Python 实战项目,超级适合练手

    关于Python,有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重 ...

  8. python实战项目 — 使用bs4 爬取猫眼电影热榜(存入本地txt、以及存储数据库列表)

    案例一: 重点: 1. 使用bs4 爬取 2. 数据写入本地 txt from bs4 import BeautifulSoup import requests url = "http:// ...

  9. python实战项目 — 爬取 妹子图网,保存图片到本地

    重点: 1. 用def函数 2. 使用 os.path.dirname("路径保存") , 实现每组图片保存在独立的文件夹中 方法1: import requests from l ...

  10. python实战项目 — 爬取 校花网图片

    重点: 1.  指定路径创建文件夹,判断是否存在 2. 保存图片文件 # 获得校花网的地址,图片的链接 import re import requests import time import os ...

随机推荐

  1. 利用node快速生成脚本

    整理框架时突然发现两个文件从来没有使用过,删除的瞬间仿佛get到了用处. fs 可用于与文件系统进行交互模块 path 提供一些实用工具,用于处理文件和目录的路径 process.argv 返回一个数 ...

  2. input、print、字符串格式化输出

    1.使用input(), print()进行用户交互 """ 以前银行取钱只能拿着存折去柜台跟小姐姐交流才可以 你想干嘛 我想取钱 请输入密码 滴滴滴密码 想取多少钱 我 ...

  3. Django 连接各数据库配置汇总(sqlite3,MySql,Oracle)

    在django中,默认配置的数据库是 sqlite3 # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#database ...

  4. js的基本数据类型和引用数据类型及深拷贝浅拷贝

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.js数据类型分两种 (1)基本数据类型(值类型):Nu ...

  5. 前后端开发必会的 HTTP 协议“十全大补丸”(万字长文)

    本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文.响应报文.持久连接.缓存.Cookie 以及 HTTP 版本升级等! HTTP 协议全称为 HyperText Transfer Pr ...

  6. 使用nodejs编写api接口并部署到服务器上

    一.用node.js编写api接口 1.安装node环境,没有就去下载nodejs, 下载地址 2.创建一个node项目, 新建一个目录文件,例node_proxy 3.在新建的node项目执行npm ...

  7. kafka详解(01) - 概述

    kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...

  8. CentOS 7安装mysql5.7-单节点&主从

    一 下载 Mysql5.7下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads Mysql精细版本存档版本下载地址:https:/ ...

  9. 迁移学习(JDDA) 《Joint domain alignment and discriminative feature learning for unsupervised deep domain adaptation》

    论文信息 论文标题:Joint domain alignment and discriminative feature learning for unsupervised deep domain ad ...

  10. Ubuntu 安装 office

    推荐安装 LibreOffice wget https://free.nchc.org.tw/tdf/libreoffice/stable/7.4.3/deb/x86_64/LibreOffice_7 ...