【自学开发之旅】Flask-前后端联调-异常标准化返回(六)

注册联调:

前端修改:
1.修改请求向后端的url地址
文件:env.development修改成VITE_API_TARGET_URL= http://127.0.0.1:9000/v1

登录:token验证

校验forms/user.py

from werkzeug.security import check_password_hash# 登录校验
class Loginform(Form):username = StringField(validators=[DataRequired()])password = StringField(validators=[DataRequired(), Regexp(r'\w{6,18}', message="密码不符合要求")])def validate(self):super().validate()if self.errors:return Falseuser = User.query.filter_by(username = self.username.data).first()if user and check_password_hash(user.password, self.password.data):return userelse:raise ValidationError("验证失败!")

router/user/user.py

from libs.auth import create_token# 登录视图
class LoginView(Resource):def post(self):data = request.jsonform = LoginForm(data = data)user = form.validate()if user:return generate_response(msg="login success!", code=0)else:return generate_response(msg="login fail!", code=1)api.add_resource(LoginView, "/login")

在config里写好secretkey和过期时间

# 内部私钥
SECRET_KEY = "123456"
# 过期时间
EXPIRES_IN = "10"

libs/auth.py生成token函数放这里

from flask import current_app
from itsdangerous import TimedSerializer# 生成token
def create_token(uid):# 生成token,第一个参数传入内部私钥,第二个参数有效期s = TimedSerializer(current_app.config["SECRET_KEY"], current_app.config["EXPIRES_IN"])token = s.dumps({"uid":uid})return token

在这里插入图片描述
每次请求的token都不一样

pyjwt是web开发里专门用来生成token的库
pip install pyjwt
libs/auth.py

import jwt
from jwt.exceptions import ExpiredSignatureError, InvalidSignatureError#用jwt生成token库
def create_token(uid):expir_in = current_app.config.get("EXPIRES_IN")payload = {"uid":uid, "exp":time.time() + expir_in}print(payload)key = current_app.config["SECRET_KEY"]token = jwt.encode(payload, key)return token

过期时间改回整形config/settings.py

# 过期时间
EXPIRES_IN = 600

在这里插入图片描述
这个token是base64加密

{"code": 0,"msg": "login success!","data": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjMsImV4cCI6MTY5NDkzMjIyOS4zNDM5MTF9.03zt-xxAvgJ487Hwfk3nyCa-vq0ml3kPcEo3SDT-UOc","username": "jd2"}
}

Header
Payload
{“alg”:“HS256”,“typ”:“JWT”}{“uid”:3,“exp”:1694932229.343911}

Signature
为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。
例如:

HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

服务端验证:拿到token之后,按照里面的header+payload+服务端保存的secretkey一起进行相同算法加密。得到新的签名,再和客户端传递的签名比较,一致就验证通过

两种验证:api验证,token验证
#验证token
libs/auth.py

def auth_required(func):def inner(*args, **kwargs):api_flag = request.args.get("api")if (api_flag == "1" and api_auth()) or token_auth():return func(*args, **kwargs)else:return "认证失败"return inner# 验证token
def token_auth():token = request.headers.get("token")if token:try:print(time.time())jwt_obj = jwt.decode(token, current_app.config.get("SECRET_KEY"),algorithms=["HS256"])except InvalidSignatureError as e:print("token不合法", e)return Falseexcept ExpiredSignatureError as e:print("token过期", e)return Falsereturn Trueelse:return False

首先POST访问127.0.0.1:9000/v1/login
得到token,复制粘贴,然后GET访问127.0.0.1:9000/v1/product,HEADERS中代token字段访问
在这里插入图片描述
前后端联调

前端流程

异常标准化返回
libs/error_code.py

from werkzeug.exceptions import HTTPExceptionclass APIException(HTTPException):code = 500   #http状态码message = "fail!"  #状态描述信息status_code = 9999 # 程序状态def __init__(self, message=None, code=None, status_code = None):if message:self.message = messageif code:self.code = codeif status_code:self.status_code = status_codesuper(APIException, self).__init__()def get_body(self, environ = None, scope = None) -> str:body = dict(message = self.message,code = self.status_code)import jsoncontent = json.dumps(body)return contentdef get_headers(self, environ = None, scope = None,) :return [('content-Type', 'application/json')]#自定义异常类
class APIAuthorizedException(APIException):message = "API授权认证失败"status_code = 10002code = 401class FormValidateException(APIException):message = "表单验证失败"status_code = 10003class TokenFailException(APIException):message = "token不合法,验证失败"status_code = 10005code = 401

libs/handler.py

from flask_restful import HTTPException
from libs.error_code import APIException#无论什么异常  都返回APIException
def default_error_handler(ex):if isinstance(ex, APIException):return exif isinstance(ex, HTTPException):code = ex.codemessage = ex.descriptionstatus_code = 10001return APIException(code = code, message=message, status_code=status_code)return APIException()
from libs.handler import default_error_handler#异常标准化返回
api.handle_error = default_error_handler

#异常标准化返回
handle_error 原本处理异常情况返回的一个方法
当发生异常情况时,会自动调用handle_error函数处理异常返回
在这里插入图片描述
修改libs/auth.py

from libs.error_code import APIAuthorizedExceptiondef auth_required(func):def inner(*args, **kwargs):api_flag = request.args.get("api")if (api_flag == "1" and api_auth()) or token_auth():return func(*args, **kwargs)else:raise APIAuthorizedExceptionreturn inner

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137538.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下安装Clion

前言 CLion 是一款由 JetBrains 开发的 C 集成开发环境(IDE),它拥有许多强大的功能,如代码自动完成、调试器、版本控制等等。CLion本身是收费软件,但如果是学生的话可以申请免费使用。 测试安装环境:Ubunt…

2614. 对角线上的质数-c语言解法

给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。 注意: 如果某个整数大于 1 ,且不存在除 1 和自身之外的正整数因子,则认为该整数是一个…

iOS蓝牙 Connection Parameters 关键参数说明

1. 先贴苹果文档 《 Accessory Design Guidelines for Apple Devices 》 2. 几个关键词 connection Event Interval 事件间隔,为1.25ms的倍数。可以简单理解为,是两个连接着的蓝牙设备发送“心跳包”的时间间隔; 范围是 6 ~ 3200,即 7.5…

【ArcGIS】土地利用变化分析详解(栅格篇)

土地利用变化分析详解-栅格篇 土地利用类型分类1 统计不同土地利用类型的面积/占比1.1 操作步骤 2 统计不同区域各类土地利用类型的面积2.1 操作步骤 3 土地利用变化转移矩阵3.1 研究思路3.2 操作步骤 4 分析不同时期土地利用类型及属性变化4.1 研究思路4.2 操作步骤 参考 土地…

建不同锁对象对同表同数据加锁会怎样?

建不同锁对象对同表同数据加锁会怎样? 同事突然问我这个问题,这种东西动手测一下,两分钟的事儿。验证下自己心中所想。 建俩锁对象~ 代码 打断点 执行: 能动手就敲一下,懒得想,懒得记~ 推荐阅读&#xff1a…

ETLCloud助力富勒TMS实现物流数仓同步

富勒TMS提供了多种运输管理业务的解决方案,极大的方便了企业对物流的管理和人力输出,同时提供了大量的API接口,供用户做数据集成和数仓同步。 通过富勒TMS中心,第三方开发者和商家可实现以下功能: MS系统数据同步&…

【QT】day4

闹钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QMouseEvent> //鼠标时间 #include <QPaintEvent> //绘制时间 #include <QPainter> //画家时间 #include <QPixmap> //图…

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql&#xff0c;看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1&#xff09;docker运行mysql 2&#xff09;启动Mysql docker run -itd…

Android Studio插件版本与Gradle 版本对应关系

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、Gradle各版本对应关系3.1 Gradle 版…

【C++】STL详解(六)—— list的模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】STL…

移动测试之语音识别功能如何测试?

移动测试之语音识别功能如何测试&#xff1f; 要知道语音识别功能如何测试&#xff0c;我们先了解智能产品语音交互流程&#xff1a; 所以&#xff0c;要进行测试的话&#xff0c;我们需要从以下几个维度来准备测试点&#xff1a; 基础功能测试&#xff1a; 1、声纹的录入&…

【Java 基础篇】Java Condition 接口详解

Java 提供了一种更灵活和高级的线程协作机制&#xff0c;通过 Condition 接口的使用&#xff0c;你可以更精细地控制线程的等待和唤醒&#xff0c;实现更复杂的线程同步和通信。本文将详细介绍 Java 的 Condition 接口&#xff0c;包括它的基本概念、常见用法以及注意事项。 什…

MyBatis 篇

目录 1、什么是MyBatis 2、说说MyBatis的优点和缺点 3、#{}和${}的区别是什么&#xff1f; 4、当实体类中的属性名和表中的字段名不一样 &#xff0c;怎么办 &#xff1f; 5、Mybatis是如何进行分页的&#xff1f;分页插件的原理是什么&#xff1f; 6、Mybatis是否支…

【大数据之Kafka】十五、Kafka-Kraft模式

1 Kafka-Kraft架构 左图为 Kafka 现有架构&#xff0c;元数据在 zookeeper 中&#xff0c;运行时动态选举 controller&#xff0c;由controller 进行 Kafka 集群管理。   右图为 kraft 模式架构&#xff08;实验性&#xff09;&#xff0c;不再依赖 zookeeper 集群&#xff0…

mysql 锁总结

redo log 是事务持久性的保证 undo log 是事务原子性的保证 锁机制 是事务隔离性的保证 MySQL的自动加锁依赖于数据库的事务机制。当事务对某个数据行进行更新操作时&#xff0c;MySQL就会自动给该行加上排他锁&#xff0c;防止其他事务同时对其进行修改。同时&#xff0c;MySQ…

【Linux】常用工具(下)

Linux常用工具 一、Linux 项目自动化构建工具 - make/Makefile1. 依赖关系和依赖方法2. 伪目标3. make/Makefile 具有依赖性的推导能力&#xff08;语法扩展&#xff09;4. 编写一个进度条代码&#xff08;1&#xff09;缓冲区&#xff08;2&#xff09;\n 和 \r&#xff08;3&…

硬件学习 PAD9.5 day02 原理图绘制中的操作,PCB 封装的制作

1. 原理图中的连线操作 1.1 点击连线按钮 1.2 点击需要连线的地方连接即可 1.3 双击即可停止连线 2. 原理图的总线绘制 2.1 按下总线绘制按钮 2.2 画一条总线 总线名称 总线名字 [ 起始数字 &#xff1a; 结束数字 ] 2.3 分线连接总线 注意&#xff1a;原理图的连线…

MySQL常用配置详解

目录 一、MySQL 查看配置信息二、MySQL 查看服务器当前运行状态的信息三、MySQL 常用配置详解1、mysql&#xff08;使用mysql命令登录数据库时的默认的设置&#xff09;2、client &#xff08;客户端默认设置内容&#xff09;3、mysqld&#xff08;服务端端配置&#xff09; 四…

【计算机网络】 拥塞控制

文章目录 背景TCP的四种拥塞控制算法慢开始与拥塞避免&#xff1a;快重传&#xff1a;快恢复&#xff1a; 流量控制和拥塞控制本质上的 区别 背景 网络中的链路容量和交换节点中的缓存和处理机都有着工作的极限&#xff0c;当网络的需求超过他们的工作极限时&#xff0c;就出现…

黄金代理前景如何,有得搞吗?

现货黄金代理这个职业时常都听人说过了&#xff0c;随着近期现货黄金走势不断出现行情&#xff0c;尤其是美国通胀严重&#xff0c;地缘政治局势频发&#xff0c;黄金走势不断获得支撑而走高。在这样的背景下&#xff0c;现货黄金代理这个职业的前景如何呢&#xff1f; 其实对于…