实验一:显示一个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起动服务