FastAPI入门

 

FastAPI框架介绍

FastAPI是一个现代、快速的Python Web框架,用于快速构建API。它基于 Pydantic 和 Starlette,使得代码更加简洁且易于绶护。

关键特性:

快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。

高效编码:提高功能开发速度约 200% 至 300%。

更少 bug:减少约 40% 的人为(开发者)导致错误。 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。 简单:设计的易于使用和学习,阅读文档的时间更短。 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。 健壮:生产可用级别的代码。还有自动生成的交互式文档。 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。


  • Starlette 用于构建 Web 部件:Starlette 是一个轻量级的 ASGI 框架和工具包,特别适合用来构建高性能的 asyncio 服务.

  • Pydantic 用于数据的操作:python 中用于数据接口定义检查与设置管理的库。

ASGI服务(WSGI)

 

WSGI,Web服务器网关接口,是一种Web服务器网关接口,它是一个Web服务器(如Nginx)与Web应用(如Flask框架写的程序)通信的一种规范。当前运行在WSGI协议之上的Web框架有Bottle,Flask,Django。  

ASGI:异步网关协议接口 ,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket。  

WSGI和ASGI的区别

WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。

FastAPI安装

安装Python虚拟环境

为什么要使用虚拟环境

  1. 隔离项目依赖:每个项目都可能依赖不同版本的库,可以安装项目所需特定版本的库。

  2. 易于复制和部署:当你需要将项目部署到另一台服务器上时,虚拟环境可以确保所有依赖都被正确安装。

  3. 提高安全性:虚拟环境可以帮助你管理安全更新。

虚拟环境的安装步骤:

python -m venv ml    # ml就是虚拟环境名称

激活虚拟环境(每次用的时候要先激活):

source ml/bin/activate

安装FastAPI

需要安装所有的可选依赖及对应功能,包括了 uvicorn,你可以将其用作运行代码的服务器。

​pip install fastapi[all] -i https://pypi.douban.com/simple/

FastAPI案例

创建一个main.py:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def root():
    return 'hello'


@app.get("/hello/{name}")
def say_hello(name: str):
    return {"message": f"Hello {name}"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

访问接口和文档:

 访问文档:

 


请求路径指的是 URL 中从第一个 / 起的后半部分。所以,在一个这样的 URL 中:

http://example.com/demo
http://127.0.0.1/demo

那么,真正的请求路径(路由)是:/demo

在FastAPI中,路由的配置是通过: 装饰器 完成的。

在 HTTP 协议中,可以使用以下的其中几种请求方法 与每个路径进行通信。

通常使用:

  • POST:创建数据。

  • GET:读取数据。

  • PUT:更新数据。

  • DELETE:删除数据。

  • PATCH: 修改单一数据

配置请求方法:

  • @app.post()

  • @app.put()

  • @app.delete()

  • @app.get()

FastAPI中请求数据

url请求参数是通过url请求地址携带的:

https://www.liblib.art/modelinfo/689c717fbce24ec8940660c4dc53c626?from=feed

这些请求参数是键值对的集合,这些键值对位于 URL 的 之后,并以 & 符号分隔。

from fastapi import FastAPI

app = FastAPI()

fake_demo_db = [{"demo_name": "Foo"}, {"demo_name": "Bar"}, {"demo_name": "Baz"}]


@app.get("/demo/")
def read_demo(skip: int = 0, limit: int = 10):
    return fake_demo_db[skip : skip + limit]

URL请求参数不是路径的固定部分,因此它们可以是可选的,并且可以有默认值。

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/demo/{demo_id}")
async def read_demo(demo__id: str, q: Union[str, None] = None, short: bool = False):
    demo = {"demo__id": demo__id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return demo

Query校验数据

QueryFastAPI专门用来装饰请求参数的类,也可以提供校验。

@app.get("/demo/")
async def read_demo(q: Union[str, None] = Query(default=None, description="参数q可以传入字符串或者不传")):
    query_demo = {"q": q}
    return query_demo

descriptionQuery中的一个字段,用来描述该参数;

字符串长度校验

@app.get("/demo2/")
async def read_demo(q: Union[str, None] = Query(default=None, max_length=50, min_length=3)):
    query_demo = {"q": q}
    return query_demo

数值大小校验

如果参数的类型是int,float就可以采用Query进行大小校验,或者范围校验。

@app.get("/demo/")
async def read_demo(id: int = Query(description="id参数必须是0到1000之间", gt=0, le=1000), q: str = Query(default=None)):
    results = {"item_id": id}
    if q:
        results.update({"q": q})
    return results

我们还可以使用 Query 去接收一组值。使用 List[str] 来接收一组值,里面的str可以根据需求随意调换。

from fastapi import FastAPI,Query
from typing import List, Union

app = FastAPI()


@app.get("/demo/")
async def read_demo(q: Union[List[str], None] = Query(default=None, description='q可以传入多个值')):
    query_demos = {"q": q}
    return query_demos


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)
  • 视图函数 read_demo 接受一个名为 q 的参数,该参数通过 Query 进行了注解。Query 是 FastAPI 提供的一个函数,用于处理查询字符串中的参数。
  •  uvicorn.run(app, host="127.0.0.1", port=8000) 来运行 FastAPI 应用

结果返回一个 JSON 响应:

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森( ﹡ˆoˆ﹡ )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值