简介
一个现代Python网络框架,它基于Starlette框架,可用于构建REST API。与知名的API标准完全兼容,即OpenAPI和JSON模式。
FastAPI没有内置任何服务器应用程序。为了运行FastAPI应用程序,你需要一个名为 uvicorn 的ASGI(Asynchronous Server Gateway Interface)服务器。符合 WSGI (Web Server Gateway Interface – 较早的标准)的Web服务器不适合 asyncio 应用。它还提供了对HTTP/2和WebSockets的支持,这些都是WSGI无法处理的。
示例
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/") #表示路径,即url
async def index():#async告诉FastAPI,它将被异步运行,即不阻塞当前执行线程
return {"message": "Hello World"}#返回一个JSON响应,也可以返回 dict、list、str、int、pydantic模型等等
uvicorn.run(app, host='localhost',
port=‘8000’, log_level="debug", timeout_keep_alive=5)
Starlette
Starlette 是一个轻量级的 ASGI 框架和工具包,特别适合用来构建高性能的 asyncio 服务。
#example.py
from starlette.responses import JSONResponse
from starlette.routing import Route
async def homepage(request):
return JSONResponse({'hello': 'world'})
app = Starlette(debug=True, routes=[
Route('/', homepage),
])
命令行启动:
uvicorn example:app
uvicorn
Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器。
# example.py
async def app(scope, receive, send):
assert scope['type'] == 'http'
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/plain'],
]
})
await send({
'type': 'http.response.body',
'body': b'Hello, world!',
})
命令行启动:
uvicorn example:app
脚本启动:
import uvicorn
async def app(scope, receive, send):
# 同上
#启动服务器后,执行curl http://127.0.0.1:5000就可以看到hello world
if __name__ == "__main__":
uvicorn.run("example:app", host="127.0.0.1", port=5000, log_level="info")#example是与文件名相同
Pydantic
Pydantic 用于数据解析和验证,它定义了 BaseModel 类,充当用户自定义类的基类。
from typing import List
from pydantic import BaseModel
class Student(BaseModel):
id: int
name :str
subjects: List[str] = []
data = {
'id': 1,
'name': 'Ravikumar',
'subjects': ["Eng", "Maths", "Sci"],
}
s1=Student(**data)
print(s1) #id=1 name='Ravikumar' subjects=['Eng', 'Maths', 'Sci']
Pydantic 会尽可能地自动转换数据类型。例如,字典中的id本来接受int,但是被分配了一个字符串表示的数字(比如’123’),它也会强转成一个整数。但是如果失败,就会引发一个异常。
Pydantic还包含一个Field类,用于声明模型属性的元数据和验证规则。
from typing import List
from pydantic import BaseModel, Field
class Student(BaseModel):
id: int #第一个参数含义是默认值,第二个title是描述,第三个是限制,此处限制name长度不超过10
name :str = Field(None, title="The description of the item", max_length=10)
subjects: List[str] = []
REST架构
关系状态转移 (REST)是一种软件架构风格。REST定义了一个网络应用程序的架构应该如何表现。它是一种基于资源的架构,REST服务器所承载的一切(一个文件、一张图片或数据库表中的一行)都是一种资源,有许多表现形式。
HTTP动作
动作 | 含义 |
get | 以未加密的形式向服务器发送数据。最常见的方法。 |
head | 与get相同,但没有响应体 |
post | 用来向服务器发送HTML表单数据。由post方法收到的数据不会被服务器缓存。 |
put | 用上传的内容替换目标资源的所有当前表示 |
delete | 删除由URL给出的目标资源的所有当前表示 |