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 ...
随机推荐
- 《HTTP权威指南》 – 11.验证码和新鲜度
服务器应当告知客户端能够将内容缓存多长时间,在这个时间内就是新鲜的.服务器可以用这两个首部之一来提供信息: Expires(过期) Cache - Control(缓存控制) Expires首部 规定 ...
- 关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL
一.关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL 注:clr指公共语言运行库 CLR是一门非常恶搞的语言,就好像是在C++里面写C#的文件一样,也就是一种所谓的"托 ...
- python函数及算法
算法二分法 二分算法图 什么是算法? 算法是高效解决问题的办法. 需求:有一个按照从小到大顺序排列的数字列表,查找某一个数字 # 定义一个无序的列表 nums = [3,4,5,67,8,9,12 ...
- java中继承的内存分析
本文主要讲述java中继承的内存分析. 示例1,代码如下: public class EncapsulationTest { public static void main(String[] args ...
- 12、synchronized和Lock的使用
转载自 1.多并发案例: 一个车站有三个窗口同时卖30张票,每个窗口都有40个人在排队买票,在多线程情况下,不加锁,线程不安全,导致卖票不准确 package com.example.Lock; /* ...
- 【深入浅出 Yarn 架构与实现】4-3 RM 管理 NodeManager
本篇继续对 RM 中管理 NodeManager 的部分进行深入的讲解.主要有三个部分:检查 NM 是否存活:管理 NM 的黑白名单:响应 NM RPC 请求. 一.简介 在 RM 的主从结构中,最主 ...
- [OpenCV实战]44 使用OpenCV进行图像超分放大
图像超分辨率(Image Super Resolution)是指从低分辨率图像或图像序列得到高分辨率图像.图像超分辨率是计算机视觉领域中一个非常重要的研究问题,广泛应用于医学图像分析.生物识别.视频监 ...
- MongoDB - 分片简介
简介 什么是分片 高数据量和高吞吐量的数据库应用会对单机的性能造成较大压力,大的查询会将单机的 CPU 耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存压力转移到磁盘 IO 上. 为了解决这 ...
- 【Surface Detection】Segmentation-Based Deep-Learning Approach for Surface-Defect Detection
物体表面缺陷检测现状 传统机器学习局限性 传统机器学习方法对于特定的算法只能解决特定的问题,不够灵活,无法快速适应新产品: 不同的问题有不同的特征,当需要解决新问题时,需要重新设计特征,开发周期长: ...
- [C++标准模板库:自修教程与参考手册]关于deque
Deque的基本概念 deque和vector很相似,也提供随机存取的能力,将元素都动态地存储在一个数组中,最大的区别就是:deque的头和尾都是开放的,非常方便在头尾两端进行一些操作.(重点在于:d ...