专栏首页python3FastAPI--中间件(6)

FastAPI--中间件(6)

一、概述

所谓的中间件,其实和我们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

总结:

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

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

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

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

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

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

6、返回response。

本文参考链接:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python import 与 from

    模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,

    py3study
  • sanic异步框架之中文文档

    在安装Sanic之前,让我们一起来看看Python在支持异步的过程中,都经历了哪些比较重大的更新。

    py3study
  • 【python 下载器】python下载

    py3study
  • django视图 CBV 和 FBV

    郭楷丰
  • Java Web学习总结(八)——HttpServletResponse对象(二)

    请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。

    Java团长
  • 【python 下载器】python下载

    py3study
  • 百度站长工具(搜索资源)平台网站改版规则踩坑记录

    如果百度已经收录的网站,会出现搜索结果打不开或者错误 404 的问题,我们可以在百度提交一下网站改版。

    德顺
  • USB OTG ID 检测原理【转】

    OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用O...

    233333
  • 前后端权限机制

    本项目使用vue全家桶,axios和cube-ui cube-ui文档地址:https://didi.github.io/cube-ui/#/zh-CN/doc...

    一粒小麦
  • Clojure使用Java方法Clojure使用Java方法

    Clojure有个很强大的功能,就是你可以使用Lisp语言风格无缝调用java api(java interop).这无疑是如虎添翼.

    一个会写诗的程序员

扫码关注云+社区

领取腾讯云代金券