Python实战项目6-后端多方式登录接口/手机登录接口
为开源项目共享代码
步骤:
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-后端多方式登录接口/手机登录接口的更多相关文章
- 再一波Python实战项目列表
前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...
- Python实战项目网络爬虫 之 爬取小说吧小说正文
本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...
- Python实战---制作专属有声小说(调用百度语音合成接口)
这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来. 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调 ...
- python实战项目
没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用到实际开发中更是不得而知了! 以上就是我们在学习过程中必须要有项目实战开发经验的原因,其实无论项 ...
- python实战项目练习-Django商城项目之注册功能实现
设计到的前端知识 项目的前端页面使用vue来实现局部刷新,通过数据的双向绑定实现与用户的交互,下面来看一下需求,在用户输入内容后,前端需要做一些简单的规则校验,我们希望在在用户输入后能够实时检测,如果 ...
- python实战项目 — selenium登陆豆瓣
利用selenium 模仿浏览器,登陆豆瓣 重点: 1. 要设置好 chromedriver配置与使用, chromedriver.exe 和 Chrome的浏览器版本要对应, http://chro ...
- 7 个有趣的 Python 实战项目,超级适合练手
关于Python,有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重 ...
- python实战项目 — 使用bs4 爬取猫眼电影热榜(存入本地txt、以及存储数据库列表)
案例一: 重点: 1. 使用bs4 爬取 2. 数据写入本地 txt from bs4 import BeautifulSoup import requests url = "http:// ...
- python实战项目 — 爬取 妹子图网,保存图片到本地
重点: 1. 用def函数 2. 使用 os.path.dirname("路径保存") , 实现每组图片保存在独立的文件夹中 方法1: import requests from l ...
- python实战项目 — 爬取 校花网图片
重点: 1. 指定路径创建文件夹,判断是否存在 2. 保存图片文件 # 获得校花网的地址,图片的链接 import re import requests import time import os ...
随机推荐
- 二阶段目标检测网络-Faster RCNN 详解
Faster RCNN 网络概述 Conv layers RPN 网络 Anchors 生成 RPN 网络训练集 positive/negative 二分类 RPN 生成 RoIs(Proposal ...
- 对象和类—Java世界的细胞
对象和类-Java世界的细胞 今天向大家介绍我自己关于Java中对象和类的一些体会,中有不足还请大家多多指教 1.面向对象程序设计 为什么会产生面向对象 我认为人们在最初探索计算机世界时,常常会从计算 ...
- 【机器学习】李宏毅——Unsupervised Learning
读这篇文章之间欢迎各位先阅读我之前写过的线性降维的文章.这篇文章应该也是属于Unsupervised Learning的内容的. Neighbor Embedding Manifold Learnin ...
- MongoDB从入门到实战之MongoDB快速入门
前言 上一章节主要概述了MongoDB的优劣势.应用场景和发展史.这一章节将快速的概述一下MongoDB的基本概念,带领大家快速入门MongoDB这个文档型的NoSQL数据库. MongoDB从入门到 ...
- [Codeforces Round #841]
[Codeforces Round #841] Codeforces Round #841 (Div. 2) and Divide by Zero 2022 A. Joey Takes Money J ...
- APICloud 平台常用技术点汇总讲解
平台介绍: 使用 APICloud 可以开发移动APP.小程序.html5 网页应用.如果要实现编写一套代码编译为多端应用(移动APP.小程序.html5 ),需使用 avm.js 框架进行开 ...
- asp前端无法获取后端中select *查询带出来的全部字段
1.环境 前端:ASP.vbscript 后端:vb 数据库:Sql Server 2.问题描述 最近在做需求时碰到一个很奇怪的问题,后端通过select *查询带出来的字段,在前端只能获取到部分字段 ...
- [数据与分析可视化] D3入门教程2-在d3中构建形状
d3.js入门教程2-在 d3.js中构建形状 文章目录 d3.js入门教程2-在 d3.js中构建形状 形状的添加 圆形的添加 矩形的添加 线段的添加 文本的添加 折线的添加 区域的添加 圆弧的添加 ...
- 网络安全之frp内网穿透
前言 内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机 环境需求 一台公网服务器(linux操作系统) ...
- VUE assets里的scss没有引用会被打包进代码里,本地代码和打包后的代码样式不一致解决办法
1.打包部署后,发现样式和本地运行时候代码不一致 经过排查发现 这个路径的文件被打包进去了,但是我并没有引用这个文件啊啊啊啊啊a~~~~ src\assets\webgl-assets\scss\st ...