广告
返回顶部
首页 > 资讯 > 后端开发 > Python >FastAPI--中间件(6)
  • 679
分享到

FastAPI--中间件(6)

中间件FastAPI 2023-01-31 08:01:28 679人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

所谓的中间件,其实和我们bottle中的中间件作用是一致。有些方法或操作需要在所有路由之前执行,比如要加一个Http访问的拦截器,可以对部分接口api需要授权才能访问的接口进行验证之类的。FastAPI提供了一个@app.middlewar

所谓的中间件,其实和我们bottle中的中间件作用是一致。有些方法或操作需要在所有路由之前执行,比如要加一个Http访问的拦截器,可以对部分接口api需要授权才能访问的接口进行验证之类的。

FastAPI提供了一个@app.middleware("http")可以做到类似上面的拦截功能。其实和bottle或flask 钩子函数很相似

 

示例如下:

import uvicorn
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

import time
from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException

app = FastAPI()


@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
    return PlainTextResponse(str(exc.detail), status_code=exc.status_code)


@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
    return jsONResponse({'mes': '触发了RequestValidationError错误,,错误信息:%s 你妹的错了!' % (str(exc))})


@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

然后我们请求完成后发现,我们的响应头里多了一个新增的请求头:

http://127.0.0.1:8000/items/2


1.png

 

 

总结

中间件实际上是一个函数,在每个request处理之前被调用,同时又在每个response返回之前被调用。

1、首先接收访问过来的request。

2、然后针对request或其他功能执行自定义逻辑。

3、传递request给应用程序继续处理。

4、接收应用所产生的response。

5、然后针对response或其他功能执行自定义逻辑。

6、返回response。

 

 

本文参考链接:

http://www.zyiz.net/tech/detail-119883.html


--结束END--

本文标题: FastAPI--中间件(6)

本文链接: https://www.lsjlt.com/news/193708.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作