web开发框架之fastapi(一)

由于我们后面会采用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请求:

image.png

使用数据模型

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}

这样可以请求:

image.png

返回如下:

image.png

使用数据模型

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 使用非常简单,关于请求参数和返回的详细内容,可以查看后面章节。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容