当前位置: 首页 > news >正文

【自学开发之旅】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

在这里插入图片描述

相关文章:

【自学开发之旅】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# 登录校验…...

springcloud3 分布式事务解决方案seata之XA模式4

一 seata的模式 1.1 seata的几种模式比较 Seata基于上述架构提供了四种不同的分布式事务解决方案: XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入 TCC模式:最终一致的分阶段事务模式,有…...

编译ctk源码

目录 前景介绍 下载The Common Toolkit (CTK) cmake-gui编译 vs2019生成 debug版本 release版本 前景介绍 CTK(Common Toolkit)是一个用于医学图像处理和可视化应用程序开发的工具集,具有以下特点: 基于开源和跨平台的Qt框…...

前后端分离的低代码快速开发框架

低代码开发正逐渐成为企业创新的关键工具。通过提高开发效率、降低成本、增强灵活性以及满足不同用户需求,低代码开发使企业能够快速响应市场需求,提供创新解决方案。选择合适的低代码平台,小成本组建一个专属于你的应用。 项目简介 这是一个…...

【Java 基础篇】Java同步代码块解决数据安全

多线程编程是现代应用程序开发中的常见需求,它可以提高程序的性能和响应能力。然而,多线程编程也带来了一个严重的问题:数据安全。在多线程环境下,多个线程同时访问和修改共享的数据可能导致数据不一致或损坏。为了解决这个问题&a…...

亿纬锦能项目总结

项目名称:亿纬锦能 项目链接:https://www.evebattery.com 项目概况: 此项目用到了 wow.js/slick.js/swiper-bundle.min.js/animate.js/appear.js/fullpage.js以及 slick.css/animate.css/fullpage.css/swiper-bundle.min.css/viewer.css 本项目是一种…...

简明 SQL 组合查询指南:掌握 UNION 实现数据筛选

在SQL中,组合查询是一种将多个SELECT查询结果合并的操作,通常使用UNION和UNION ALL两种方式。 UNION 用于合并多个查询结果集,同时去除重复的行,即只保留一份相同的数据。UNION ALL 也用于合并多个查询结果集,但不去除…...

【springMvc】自定义注解的使用方式

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》 ⛺️ 生活的理想,为了不断更新自己 ! 1.前言 1.1.什么是注解 Annontation是Java5开始引入的新特征,中文名称叫注解。 它提供了一种安全…...

求二维子数组的和(剖析)

文章目录 🐒个人主页🏅JavaSE系列专栏📖前言:本篇剖析一下二维子数组求和规则: 🐒个人主页 🏅JavaSE系列专栏 📖前言:本篇剖析一下二维子数组求和 规则: 这…...

无(低)代码开发思路介绍

无代码或者低代码开发的思路,是通过非编程代码,而是基于页面拖拉拽的方式来实现创建web应用的功能。 作为程序员我们知道私有云公有云已经实现了基础设施的web方式管理。DEVOPS把代码发布,管理也实现了web方式管理。那么我们很容易能够想到,只要把拖拉拽出来的项目自动化部…...

代码随想录刷题 Day14

144.二叉树的前序遍历(opens new window) 要注意下创建函数参数传递不是很理解 class Solution { public:void tranversal(TreeNode* s, vector<int> &b) {if (s NULL) {return;}b.push_back(s->val);tranversal(s->left, b);tranversal(s->right, b);}v…...

二分类问题的解决利器:逻辑回归算法详解(一)

文章目录 &#x1f34b;引言&#x1f34b;逻辑回归的原理&#x1f34b;逻辑回归的应用场景&#x1f34b;逻辑回归的实现 &#x1f34b;引言 逻辑回归是机器学习领域中一种重要的分类算法&#xff0c;它常用于解决二分类问题。无论是垃圾邮件过滤、疾病诊断还是客户流失预测&…...

docker alpine镜像中遇到 not found

1.问题&#xff1a; docker alpine镜像中遇到 sh: xxx: not found 例如 # monerod //注&#xff1a;此可执行文件已放到/usr/local/bin/ sh: monerod: not found2.原因 由于alpine镜像使用的是musl libc而不是gnu libc&#xff0c;/lib64/ 是不存在的。但他们是兼容的&…...

python的多线程多进程与多协程

python的多线程是假多线程&#xff0c;本质是交叉串行&#xff0c;并不是严格意义上的并行&#xff0c;或者可以这样说&#xff0c;不管怎么来python的多线程在同一时间有且只有一个线程在执行(举个例子&#xff0c;n个人抢一个座位&#xff0c;但是座位就这一个&#xff0c;不…...

一文介绍使用 JIT 认证后实时同步用户更加优雅

首先本次说的 JIT 指的是 Just In Time &#xff0c;可以理解为及时录入&#xff0c;一般用在什么样的场景呢&#xff1f; 还记的上次我们说过关于第三方组织结构同步的功能实现&#xff0c;主要目的是将第三方源数据同步到内部平台中来&#xff0c;方便做管控和处理 此处的管…...

搞定“项目八怪”,你就是管理高手!

大家好&#xff0c;我是老原。 玛丽.弗列特说&#xff1a;“权力已经逐渐被视为一个群体的组合能力。我们通过有效联系获取力量。” 有效联系也就是指的沟通&#xff0c;这个部分占据我们项目经理工作内容的80%&#xff0c;可见沟通在项目管理中的重要性。 项目经理的沟通包…...

机器视觉-标定篇

3D结构光标定 结构光视觉的优点&#xff1a; 非接触、信息量大、测精度高、抗干扰能力强。 结构光视觉传感器参数的标定包括&#xff1a;摄像机参数标定、结构光平面参数标定。 结构光视觉测量原理图 我们不考虑镜头的畸变&#xff0c;将相机的成像模型简化为小孔成像模型…...

linux离线安装make

一、下载rpm包 https://pkgs.org/search/?qmake 二、拷贝至服务器 三、安装make rpm -ivh make-3.82-24.el7.x86_64.rpm四、查看是否安装成功 make -v...

【深度学习】卷积神经网络(LeNet)【文章重新修改中】

卷积神经网络 LeNet 前言LeNet 模型代码实现MINST代码分块解析1 构建 LeNet 网络结构2 加载数据集3 初始化模型和优化器4 训练模型5 训练完成 完整代码 Fashion-MINST代码分块解析1 构建 LeNet 网络结构2 初始化模型参数3 加载数据集4 定义损失函数和优化器5 训练模型 完整代码…...

win10 Baichuan2-7B-Chat-4bits 上部署 百川2-7B-对话模型-4bits量化版

搞了两天才搞清楚跑通 好难呢,个人电脑 win10 ,6GB显存 个人感觉 生成速度很慢,数学能力不怎么行 没有ChatGLM2-6B 强,逻辑还行, 要求: 我的部署流程 1.下载模型 ,下载所有文件 然后 放到新建的model目录 https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits/tr…...

2023/9/20总结

maven maven本质是 一个项目管理工具 将项目开发 和 管理过程 抽象成 一个项目对象模型&#xff08;POM&#xff09; POM &#xff08;Project Object Model&#xff09; 项目对象模型 作用 项目构建 提供标准的自动化 项目构建 方式依赖管理 方便快捷的管理项目依赖的资源…...

【Git】git 分支或指定文件回退到指定版本

目录 一、分支回滚 1. 使用 git reset 命令 2.使用 git revert 命令 3.使用 git checkout 命令 二、某个文件回滚 1.查看哪些文件发生修改 2.然后查看提交记录(最近几次提交) 3.执行提交命令 一、分支回滚 1. 使用 git reset 命令 命令可以将当前分支的 HEAD 指针指向指…...

Java 消息策略的实现 - Kafak 是怎么设计的

这个也是开放讨论题&#xff0c;主要讨论下 Kafka 在消息中是如何进行实现的。 1_cCyPNzf95ygMFUgsrleHtw976506 21.4 KB 总结 这个题目的开发性太强了。 Kafka 可以用的地方非常多&#xff0c;我经历过的项目有 Kafka 用在消息处理策略上的。这个主要是 IoT 项目&#xff0c…...

c++opencv RotatedRect 旋转矩形角度转换和顶点顺序转换

这里写自定义目录标题 以下代码记录主要是完成轮廓点求解最小外接矩形之后计算该文本行的角度和旋转矩形的左下&#xff08;bl&#xff09;&#xff0c;左上&#xff08;tl)&#xff0c;右上&#xff08;tr),右下&#xff08;br)的坐标点。 RotatedRect rtminAreaRect(contours…...

Flink-CDC 抽取SQLServer问题总结

Flink-CDC 抽取SQLServer问题总结 背景 flink-cdc 抽取数据到kafka 中&#xff0c;使用flink-sql进行开发&#xff0c;相关问题总结flink-cdc 配置SQLServer cdc参数 1.创建CDC 使用的角色, 并授权给其查询待采集数据数据库 -- a.创建角色 create role flink_role;-- b.授权…...

Linux 系统目录结构 终端

系统目录结构 Linux 或 Unix 操作系统中&#xff0c;所有文件和目录呈一个以根节点为始的倒置的树状结构。文件系统的最顶层是根目录&#xff0c;用 / 来表示根目录。在根目录之下的既可以是目录&#xff0c;也可以是文件&#xff0c;而每一个目录中又可以包含子目录文件。如此…...

Layui + Flask | 实现注册、登录功能(案例篇)(08)

此案例内容比较多,建议滑到最后点击阅读原文,阅读体验更佳。后续也会录制案例视频,将在本周内上传到同名的 b 站账号。 已经看了 layui 表单相关的知识,接下来就可以实现注册功能,功能逻辑如下: 项目创建 新建 flask 项目下载 layui 文件,解压之后复制到指定文件编写前…...

GitLab数据迁移后出现500错误

一、背景 去年做GitLab数据迁移时&#xff0c;写过一篇文章《GitLab的备份与还原》。后来发现新创建的项目没问题&#xff0c;但对于迁移过来的项目&#xff0c;修改名称等信息&#xff0c;或者删除该项目时&#xff0c;会出现500错误&#xff0c;以为是系统问题&#…...

音乐随行,公网畅享,群辉Audiostation给你带来听歌新体验!

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…...

机器学习入门:从算法到实际应用

机器学习入门&#xff1a;从算法到实际应用 机器学习入门&#xff1a;从算法到实际应用摘要引言机器学习基础1. 什么是机器学习&#xff1f;2. 监督学习 vs. 无监督学习 机器学习算法3. 线性回归4. 决策树和随机森林 数据准备和模型训练5. 数据预处理6. 模型训练与调优 实际应用…...

网站开发工程师是web吗/优化seo设置

很早之前做过一个&#xff0c;白板没界面&#xff0c;20秒暴力刷新&#xff0c;数据库每个team一个n列的对应n个题目的标记项&#xff0c;只能对单个比赛暴力把全部user_id导入单独的气球表&#xff08;也就是cid1000用这个表的话&#xff0c;cid1001就不能用&#xff09;。 后…...

网站数据库访问/企业推广软文

文章目录1. 异常与中断的概念及处理流程17.1 中断的引入17.1.1 妈妈怎么知道孩子醒了17.1.2 嵌入系统中也有类似的情况17.2 中断的处理流程17.3 异常向量表17.4 参考资料1. 异常与中断的概念及处理流程 17.1 中断的引入 17.1.1 妈妈怎么知道孩子醒了 妈妈怎么知道卧室里小孩醒…...

做公司网站的费用/广州发布紧急通知

我正在为网站进行数据导入功能 . 我在宅基地上使用Laravel 5.1&#xff0c;并给了机器4GB的RAM和两个虚拟的cpu . 为了导入数据&#xff0c;我使用了Laravel Excel软件包&#xff0c;其chuncking机制基本上打破了块中的数据集&#xff0c;并将处理添加到队列中 . 其工作流程如下…...

帝国cms做门户网站/网站收录情况查询

Cocoa Cocoa基于Quartz&#xff0c;采用Painter model来绘制 Painter model主要是在一个连续的绘制操作中会将一层的绘制应用于一个output 画布(canvas)上 在添加新的绘制层(layers of paints)时先前的绘制层可能被覆盖或者修改 绘制环境(drawing enviroment) 包含数字画布(…...

教育技术专业网站开发课程/各种资源都有的搜索引擎

http://blog.csdn.net/xyz_lmn/article/category/912146...

wordpress 前台加载慢/百度一下知道首页

1 Service Kubernetes Pods 是有生命周期的。他们会被创建&#xff0c;被销毁&#xff0c;但是他们不会无条件"复活"。比如 ReplicaSets 这种 Pod 控制器会动态生成或者销毁 Pods&#xff08;如在扩容或者缩容时&#xff09;。当然每个Pod 都会自动被 k8s 分配IP地址…...