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 ...
随机推荐
- 帮你短时间拿下Git,Git详细教程(浓缩的都是精华)
Git学习笔记 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 在团队开发中git是必不可少的,它是目前为止最流行的版本控制工具 Git是免费.开源的,由Li ...
- List排序(降序)
一.添加一个比较器 点击查看代码 import java.util.Comparator; /** * @Classname ComparatorResultType * @Description 排 ...
- UVA439 Knight Moves
原题Vjudge 题目大意 有一个骑士,他可以骑马日字型跳跃,问他从A点到B点最少要几步 解题思路 这题就是一个特别裸的广搜板子 它的主要问题在于输入输出 输入的数据我们可以用\(pair\)读入,第 ...
- linux系统中安装虚拟机
在linux系统中,利用图形化界面安装虚拟机.首先启动 virt-manager,当然没有安装 virt-manager需要先安装好. 1 $ apt-get install virt-manager ...
- docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES
一.前言 在数据量大的企业级实践中,Elasticsearch显得非常常见,特别是数据表超过千万级后,无论怎么优化,还是有点力不从心!使用中,最首先的问题就是怎么把千万级数据同步到Elasticsea ...
- 第一个shell
首先进入linux系统,打开命令行,输入命令vi test.sh创建一个shell测试脚本,键入i切换vi编辑器为输入模式,输入以下文本内容,键入:wq保存退出即可.下面第一行的#!是告诉系统其后路径 ...
- Java入门与进阶P-5.3+P-5.4
数组的元素 有效的下标 最小的下标是0,最大的下标是数组的元素个数-1 可是编译器不会检查看你是否用了有效的下标 但是如果运行的时候出现了无效的下标,可能会导致程序终止 定义数组变量 元素个数必须是整 ...
- R数据分析:孟德尔随机化中介的原理和实操
中介本身就是回归,基本上我看到的很多的调查性研究中在中介分析的方法部分都不会去提混杂,都是默认一个三角形画好,中介关系就算过去了,这里面默认的逻辑就是前两步回归中的混杂是一样的,计算中介效应的时候就自 ...
- Lodop打印小票
使用Lodop打印小票 1.html页面 <head> <meta http-equiv="Content-Type" content="text/ht ...
- mysql03-默认的几个数据库
https://blog.csdn.net/dj673344908/article/details/80482844 1.查看mysql默认的数据库 在安装好mysql后,登录mysql,执行语句:s ...