由于我们后面会采用python进行开发,这里介绍一下我们选择的服务开发框架:fastapi。
fastapi介绍
如上,我们其实采用了fastapi
这个框架进行开发,fastapi
是一个现代、快速(高性能)的python web框架。
fastapi
为RESTful风格,通过GET、POST、PUT、DELETE等动作,对服务端资源进行操作。
需要说明的是,fastapi
是基于如下两个组件开发:
需要安装:
$ pip install fastapi
$ pip install uvicorn
fastapi开发示例
创建名为 main.py 的文件:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
运行如下代码即可:
$ fastapi dev main.py
默认在如下地址打开服务 http://127.0.0.1:8000/items/5?q=somequery
,可以采用postman请求:
使用数据模型
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
这样可以请求:
返回如下:
使用数据模型
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
在PostMan中使用put请求就可用了。
数据转换
可将input data进行转换(network data -> Python data)
- JSON数据转换
- 路径参数
- Query参数
- Cookies
- Headers
- Forms/Files
可将output data进行转换(Python data -> network data)
- 将Python type进行转换
-
datetime
对象 -
UUID
对象 - Database models
- 其它模型
类型系统
fastapi,一般是需要给类型添加参数的。如 first_name: str, last_name: str
。
类型可申明为:str, int, float, bool, bytes
。
还有一些结构体的类型:dict, list, set, tuple
,它们内部的数据也可以进一步的申明类型。
def process_items(items: list[str]):
for item in items:
print(item)
def process_items(items_t: tuple[int, int, str], items_s: set[bytes]):
return items_t, items_s
def process_items(prices: dict[str, float]):
for item_name, item_price in prices.items():
print(item_name)
print(item_price)
# you can use the Union type from typing
def process_item(item: int | str):
print(item)
from typing import Optional
def say_hi(name: Optional[str] = None):
if name is not None:
print(f"Hey {name}!")
else:
print("Hello World")
注意:Optional[Something]
等价于 Union[Something, None]
等价于 Something | None
。
关于Model的使用
from datetime import datetime
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe"
signup_ts: datetime | None = None
friends: list[int] = []
external_data = {
"id": "123",
"signup_ts": "2017-06-01 12:22",
"friends": [1, "2", b"3"],
}
user = User(**external_data)
print(user)
总结
fastapi
使用非常简单,关于请求参数和返回的详细内容,可以查看后面章节。