FastApi 快速上手使用

一、安装

#安装fastapi的语句
pip install fastapi

#可以使用国内阿里云镜像源进行安装,会快很多,上面的语句变成下面的:
pip install fastapi -i https://mirrors.aliyun.com/pypi/simple

#因为fastapi启动依赖于uvicorn,所以我们还需要安装uvicorn
pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple

验证是否安装成功

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/test")
def read_root():
    return {"Hello": "World"}
    
if __name__ == '__main__':
    uvicorn.run(app=app,host="0.0.0.0",port=8080,workers=1)

启动服务

FastApi 快速上手使用_第1张图片

get请求,浏览器访问http://localhost:8080/test

FastApi 快速上手使用_第2张图片

如果你此时访问 http://localhost:8080/docs。你将会看到自动生成的API交互文档。swagger文档

FastApi 快速上手使用_第3张图片

二、FastApi结构

2.1.导入FastAPI

from fastapi import FastAPI

2.2.创建一个app实例

app = FastAPI()

2.3.编写一个 路径操作装饰器

@app.get("/")
  • 你可以将get操作方法更改成@app.post()、@app.put()、@app.delete()等方法
  • 你可以更改相应的路径("/")为自己想要的,例如我更改为("/hello_word/")

2.4.编写一个路径操作函数,例如下面代码中的root函数。它位于路径操作装饰器下方(见上方例子)

def read_root():
    return {"Hello": "World"}

这个函数的返回值可以是:

dict,list,单独的值,比如str,int,或者是Pydantic模型

2.5.运行开发服务器uvicorn main:app --reload即可访问api链接。

例如我在终端运行uvicorn main:app --reload之后,在浏览器输入127.0.0.1:8000,出现"message": "Hello World"这句话。

在这里可以自己指定要运行的服务器ip和端口号。

三、路径操作装饰器中的路径参数

3.1声明路径参数

使用Python格式字符串的语法声明路径参数,例子

# 参数为ID
@app.get("/test1/{id}")
def test1(id):
    return {'id': id}

上述代码运行之后,路径参数 id 的值会作为test1函数参数 id 的值。

swagger中调用响应如下

FastApi 快速上手使用_第4张图片

3.2 声明路径参数的类型

使用 标准的Python类型注释在函数中声明路径参数的类型,例子:

# 指定参数类型为 int
@app.get("/test2/{id}")
def test2(id: int):
    return {'id': id}

上述将参数id的类型定义为int类型

FastAPI会自动为我们做数据校验的功能,所有的数据验证都是由 Pydantic实现的.可以用同样的类型声明比如 str, float, bool 或者其他更复杂的类型

指定参数类型,若不匹配会存在提示

FastApi 快速上手使用_第5张图片

参数类型匹配,可正常通过

FastApi 快速上手使用_第6张图片

3.3限定路径参数有效值

我们只想给某个路径参数传递某几个固定的有效值

class Hjx_Class(str, Enum):
    name = "joker"
    age = 24
    id = 1280
    student = True

@app.get("/test3/{hjx}")
def test3(hjx: Hjx_Class):
    return {"status": hjx}

第一步、创建一个继承str和Enum的类,并创建几个类属性,这些类属性的值将是可用的有效值

第二步、声明路径参数。路径参数hjx_man的值将传递给函数root的参数hjx_man,并且这个值的取值范围只能是Hjx_Class_name类中类属性的值。

限制类型

FastApi 快速上手使用_第7张图片

FastApi 快速上手使用_第8张图片

FastApi 快速上手使用_第9张图片

四、查询参数

当你声明不属于路径参数的其他函数参数时,它们将自动解释为“Query”参数,也就是查询参数。

查询参数就是一系列在URL?之后的key-value键值对,每对键值对用 & 分割开来。例如

http://127.0.0.1:8000/items/?skip=0&limit=10

查询参数有两个,一个是skip,一个是limit,它们的值分别为0,10

4.1 例子

@app.get("/files/")
def add(num1: int=2, num2 int=8):
    return {"num1 + num2 = ": num1 + num2}

当你使用浏览器访问http://127.0.0.1:8080/files/?num1=2&num2=3,你会得到:{"num1 + num2 = ":5}

4.2 给查询参数设置默认值

query参数类不是path中固定的一部分,所以他们是可选的,并且可以有默认值。

例如上面的例子,当你使用浏览器访问http://127.0.0.1:8080/files/,你会得到:{"num1 + num2 = ":10}

4.3 设置可选的查询参数

声明可选的Query参数,只需要将他们的默认值设置为None即可。

  • 如果设置的查询参数没有默认值不是None,那么这个查询参数就是必需查询参数,必须要传入,否则会报错
  • 查询参数可以和路径参数结合使用
@app.get("/test4/")
def test4(a: str, b: int=None):
    return {'a': a, 'b': b}

五、请求体

如何实现请求体Request Body

第一步,从pydantic中导入BaseModel

from pydantic import BaseModel

第二步,创建请求体数据模型

声明请求体数据模型为一个类,且该类继承 BaseModel。所有的属性都用标准Python类。

和查询参数一样:数据类型的属性如果不是必须的话,可以拥有一个默认值或者是可选None。否则,该属性就是必须的。

class Item(BaseModel):
    name: str 
    age: int
 #   description: str = None

第三步、将模型定义为参数

@app.post("/test5")
def test5(item: Item):
    return {"item_name": item.name, "item_age": item.age}

此时请求后响应如下

FastApi 快速上手使用_第10张图片

六、给查询参数设置验证条件.

6.1 简单使用

@app.get("/test6/")
def test6(q: str = None):
    results = {"items": 'haha'}
    if q:
        results.update({"q": q})  # 给字典results添加一个健值对{"q": q}
    return results

查询 参数 q 是str 类型, 并且默认为 None, 说明它是可选的

6.2 为查询参数添加验证

我们将设置:即使 q 是可选的,只要提供了q,它的长度就不能超过5个字符

第一步,导入Query

from fastapi import FastAPI, Query

第二步、使用 Query 设置max_length验证

@app.get("/test7/")
def test7(q: str = Query(None, max_length=5)):
    results = {"items": 'hahaha'}
    if q:
        results.update({"q": q})
    return results

因为我们必须用 Query(None) 替换默认值None,所以Query的第一个参数是定义默认值。当默认值为None,也表示这个参数是可选的。当默认值为...,表示这个参数是必选的。

q: str = Query(None,  max_length=50)  # 可选
q: str = Query(... , max_length=50)  # 必选

例如你将默认值设置为’hello word’

q: str = Query('hello word', max_length=50)

转载自: 超全面整理fastAPI(从入门到运用),进来看十秒钟再走不迟_是猪哥不是诸葛的博客-CSDN博客

你可能感兴趣的:(Python,大数据,python,开发语言)