FastAPI代码片段-01-认识FastAPI

113 阅读3分钟

实验一:显示一个message为hello的接口

# 第一章 实验代码 exam01.py
from fastapi import FastAPI
import uvicorn
app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello 三酷猫!"}

if __name__ == "__main__":
    uvicorn.run(app=app)

基础代码

# 【示例1.1】 第一章 第1.3.1节
from fastapi import FastAPI               # 导入FastAPI类
import uvicorn                            # 导入uvicorn,ASGI容器

app = FastAPI()                           # 创建应用实例

@app.get("/")                             # 定义路由路径
async def root():                         # 定义路径操作函数
    return {"message": "Hello 三酷猫!"}   # 返回“Hello 三酷猫!”信息到浏览器上

if __name__ == "__main__":
    uvicorn.run(app=app)                  # 在ASGI容器中起动FastAPI应用实例
# 【示例1.2】 第一章 第1.4.2节 code1_2.py
def print_name_with_age1(name, age):  # 函数print_name_with_age1有两个参数
    print(name + age)                 # 打印参数

print_name_with_age1('张三', 20)       # 调用函数

# 【示例1.3】 第一章 第1.4.2节 code1_3.py
def print_name_with_age2(name: str, age: int): # 函数的两个参数的类型分别是str, int
    print(name + "is this old: " + age)        # 打印参数

print_name_with_age2('张三', 20)                # 调用函数

# 【示例1.4】 第一章 第1.4.2节 code1_4.py
from typing import List               # 从typing模块中导入List

def process_items(items: List[str]):  # 定义函数,参数为字符串列表泛型
    for item in items:                # 遍历列表中的元素
        print(item)                   # 打印每一项元素

process_items(['a', 'b', 'c'])        # 调用函数

# 【示例1.5】 第一章 第1.4.2节 code1_5.py
from typing import Set, Tuple           # 从typing模块中导入Set和Tuple

def process_items(                      # 定义函数
        items_t: Tuple[int, int, str],  # 元组泛型参数
        items_s: Set[bytes]             # 集合泛型参数
    ):
    return items_t, items_s

# 【示例1.6】 第一章 第1.4.2节 code1_6.py
from typing import Dict                          # 从typing模块中引入Dict

def process_items(prices: Dict[str, float]):     # 定义函数,参数是字典泛型
    for item_name, item_price in prices.items(): # 遍历字典的内容
        print(item_name)                         # 打印字典项的键
        print(item_price)                        # 打印字典项的值

# 【示例1.7】 第一章 第1.4.2节 code1_7.py
from typing import Optional             # 从typing模块中导入Optional

def say_my_name(name: Optional[str] = None): # 定义函数,参数类型是可选类型
    if name is not None:                # 当name不为空时,打印 Hye name
        print(f"我是 {name}!")           # 打印字符串
    else:
        print("喵")            # 否则打印默认字符串
say_my_name()                  # 调用函数是不传参数
say_my_name('三酷猫')           # 调用函数时,传入一个名字
# 【示例1.8】 第一章 第1.4.2节 code1_8.py
class Person:                             # 定义类
    def __init__(self, name: str):        # 类的构造方法,初始化属性:name
        self.name = name

def get_person_name(one_person: Person):  # 定义函数,参数类型是自定义类
    return one_person.name            # 返回自定义类实例的属性
# 【示例1.9】 第一章 第1.4.3节 code1_9.py
from pydantic import BaseModel                      # 从pydantic模块中导入BaseModel

class User(BaseModel):                              # 定义数据模型User,继承BaseModel
    id: int                                         # 字段 id 类型int
    name = '三酷猫'                                  # 字段 name 未指定类型 值为 '三酷猫'

user = User(id='123')                               # 创建数据模型实例
assert user.id == 123                               # 断言 实例的字段 id
assert user.name == '三酷猫'                         # 断言 实例的字段 name
assert user.__fields_set__ == {'id'}                # 断言 user的字段集合
assert user.dict() == dict(user)                    # 断言 实例获取的字典数据
assert user.dict() == {'id': 123, 'name': '三酷猫'}  # 断言 实例获取的字典数据
user.id = 321                                       # 修改 实例的字段值
assert user.id == 321                               # 断言 实例的字段 id
# 【示例1.10】 第一章 第1.4.3节 code1_10.py
from typing import List
from pydantic import BaseModel, Field

class Blackboard(BaseModel):          # 定义数据模型类继承自BaseModel
    size = 4000                       # 字段类型int
    color: str = Field(..., alias='颜色', gt=1, description='黑板的颜色,可选green和black')

class Table(BaseModel):                # 定义数据模型类继承自BaseModel
    position: str                      # 字段默认白

class ClassRoom(BaseModel):            # 定义数据模型类继承自BaseModel
    blackboard: Blackboard             # 字段类型使用数据模型类Body
    tables: List[Table]                # 字段类型使用列表泛型

m = ClassRoom(                        # 创建数据模型实例
    blackboard={'color': 'green' },
    tables=[{'position': '第一排左1'}, {'position': '第一排左2'}]
)

print(m)
print(m.dict())

# 【示例1.11】 第一章 第1.4.4节 code1_11.py
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
import uvicorn

async def root(request):                       # 定义异步函数,参数为请求对象
    return JSONResponse({'hello': '三酷猫'})    # 返回JSON响应

app = Starlette(debug=True, routes=[           # 创建服务实例
    Route('/', root),                          # 定义路由,将路径 / 指向异步函数root
])

if __name__ == '__main__':
    uvicorn.run(app=app)                       # 使用uvicorn起动服务