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

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件

1.1 介绍(ChatGPT抄的,大致可以理解)

一种机制,用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑,以实现一些通用的功能,如身份验证、日志记录、错误处理等。

中间件在请求到达应用程序之前被执行,并在应用程序生成响应之前被执行。它们可以对请求进行修改、记录请求信息、添加额外的响应头,甚至可以拒绝请求或提前返回响应。

在FastAPI中,可以通过编写中间件函数来定义中间件逻辑。这些函数接收一个Request对象和一个Callable对象(代表下一个中间件或请求处理器)作为参数,并返回一个Response对象。

注释:
我理解就是在中间件里写一个函数,所有路由函数在执行前都会执行此函数

1.2 示例

import uvicorn
from fastapi import FastAPI, Requestapp = FastAPI()# 中间件
@app.middleware("http")
async def m2(request:Request, call_next):# 请求代码块print("m2 request")response = await call_next(request)# 响应代码块print("m2 response")return response@app.middleware("http")
async def m1(request: Request, call_next):# 请求代码块print("m1 request")response = await call_next(request)# 响应代码块print("m1 response")return response@app.get("/user")
async def get_user():print("get_user函数执行")return {"user":"current user"}@app.get("/item/{item_id}")
async def get_item(item_id:int):print("get_item函数执行")return {"item_id":item_id}if __name__ == "__main__":uvicorn.run("main:app", port=5050, reload=True)

注释:
执行顺序为:request先下后上,response先上后下,先执行request,再执行response

在这里插入图片描述

1.3 示例

import timeimport uvicorn
from fastapi import FastAPI, Requestfrom fastapi.responses import Responseapp = FastAPI()# 中间件
@app.middleware("http")
async def m2(request:Request, call_next):# 请求代码块print("m2 request")response = await call_next(request)# 响应代码块print("m2 response")return response@app.middleware("http")
async def m1(request: Request, call_next):# 请求代码块print("m1 request")# 示例:访问url限制if request.client.host in ["127.0.0.1",]:return Response(status_code=403, content="visit forbidden")# 示例:访问路径限制if request.url.path in ["/user"]:return Response(status_code=403, content="visit forbidden")response = await call_next(request)# 响应代码块print("m1 response")return response@app.get("/user")
async def get_user():print("get_user函数执行")return {"user":"current user"}@app.get("/item/{item_id}")
async def get_item(item_id:int):print("get_item函数执行")return {"item_id":item_id}if __name__ == "__main__":uvicorn.run("main:app", host="127.0.0.1", port=5050, reload=True)

在这里插入图片描述

1.4 response响应示例

import timeimport uvicorn
from fastapi import FastAPI, Requestfrom fastapi.responses import Responseapp = FastAPI()# 中间件
@app.middleware("http")
async def m2(request:Request, call_next):# 请求代码块print("m2 request")response = await call_next(request)# 响应代码块print("m2 response")return response@app.middleware("http")
async def m1(request: Request, call_next):# 请求代码块print("m1 request")# 示例:访问url限制# if request.client.host in ["127.0.0.1",]:#     return Response(status_code=403, content="visit forbidden")# # 示例:访问路径限制# if request.url.path in ["/user"]:#     return Response(status_code=403, content="visit forbidden")start = time.time()response = await call_next(request)# 响应代码块print("m1 response")end = time.time()response.headers["ProcessTimer"] = str(end - start)return response@app.get("/user")
async def get_user():time.sleep(3)print("get_user函数执行")return {"user":"current user"}@app.get("/item/{item_id}")
async def get_item(item_id:int):time.sleep(2)print("get_item函数执行")return {"item_id":item_id}if __name__ == "__main__":uvicorn.run("main:app", host="127.0.0.1", port=5050, reload=True)

在这里插入图片描述

2. CORS跨域请求

import uvicorn
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()app.add_middleware(CORSMiddleware,allow_methods=['GET', 'POST'],allow_headers=['*']
)# @app.middleware("http")
# async def HelloMiddleware(request:Request, call_next):
#     response = await call_next(request)
#     response.headers["Access-Control-Allow-Origin"] = "*"
#     return response@app.get("/hello")
async def get_hello():return {"message": "hello xujie"}if __name__ == "__main__":uvicorn.run("main:app", port=5050, reload=True)

注释:
fastapi框架(测试开发用)差不多就这些了,请求、响应、assert、数据库、中间件、跨域、template、基本上合作开发一套简单自用测试平台已经够用(至少我是这样的),填坑完成,撒花

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入
  • 在 Ubuntu 22.04/20.04 安装 CVAT 和 SAM 指南
  • Mysql sql技巧与优化
  • Linux环境下MongoDB安装与主从集群,高可用集群配置教程
  • Training for Stable Diffusion
  • SQL labs靶场-SQL注入入门
  • Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册
  • 向量化操作
  • ELK企业级日志分析
  • Docker安装nacos(详细教程)
  • Linux-查看dd命令进度
  • layui自定义defaultToolbar 新增按钮 隐藏列表操作栏浮动部分
  • 山东航空小程序查询
  • C++ 栈( stack )学习
  • Element UI DatePicker选择日期范围区间默认显示前一个月和本月
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Codepen 每日精选(2018-3-25)
  • ComponentOne 2017 V2版本正式发布
  • IOS评论框不贴底(ios12新bug)
  • Java小白进阶笔记(3)-初级面向对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • text-decoration与color属性
  • vue--为什么data属性必须是一个函数
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 码农张的Bug人生 - 见面之礼
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 模型微调
  • 前端临床手札——文件上传
  • 如何合理的规划jvm性能调优
  • 十年未变!安全,谁之责?(下)
  • 系统认识JavaScript正则表达式
  • ​iOS安全加固方法及实现
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %@ page import=%的用法
  • (175)FPGA门控时钟技术
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (9)STL算法之逆转旋转
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (十三)Flask之特殊装饰器详解
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)前K大的和
  • (转) RFS+AutoItLibrary测试web对话框
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .gitignore
  • .net core Swagger 过滤部分Api
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore 获取appsettings
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点