文件名称 | 版本号 | 作者 | 版本 | |
---|---|---|---|---|
可能是最好用的Python API开发框架,好简单,非Gen | v1.0.1 | 学生宫布 | 8416837 | Python 3.8 FastAPI (0.1.0) |
FastAPI REST版
试水
- 这里假设你已经会使用一款IDE(集成开发环境)或命令行
安装依赖
- 安装依赖
用的工具可能是pip
|pip3
执行pip3 --help
试一下。
如果以下安装太慢,请使用国内镜像。
pip3 install fastapi
# ASGI 服务:uvicorn:
pip3 install uvicorn
代码
- 主类 main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/{name}")
def read_root(name):
return {"Hello": "World" + name}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
启动
命令行启动项目
uvicorn main:app --reload --port=8000
【注意】IDE执行上述命令可能因配置问题而闪退
启动成功:
调用
- 接口1
localhost:8000/_name
- 接口2
localhost:8000/items/3001?q=狗
文档
- FastAPI自带文档,地址是
http://localhost:8000/docs
- 同时自带redoc文档,访问地址是
http://localhost:8000/redoc
炫技
参数验证
Json参数的接口
- 代码比上述代码复杂一点点
- 服务端:
from pydantic import BaseModel
from fastapi import FastAPI
app = FastAPI()
class Dog(BaseModel):
nick_name: str
tooth: int
sex: int
age_month: float
@app.post("/dog")
def read_item(dog: Dog):
print(dog)
return dog
- 客户端:
HTTPClient传json参数,以期获得响应参数
import requests
url = "http://localhost:8000/dog"
params = {"nick_name":"QWo","sex":1,"tooth":34, "age_month": 13.5}
res = requests.post(url,json=params)
res.json()
用python代码执行请求,响应没问题:
或者使用客户端软件调用,也成功了:
Json参数型亦可转为Raw型,用raw型也好用,raw型也可以直接输入{}:
测试功能
- 框架底层做了封装,使用Python HTTPClient随手测试一下
import requests
url = "http://localhost:8000/dog"
params = {"nick_name":"QWo","sex":1,"tooth":"99"}
res = requests.post(url,json=params)
res.json()
- 故意传错参数试试:
↑自动将字符串强转成了数字。 - 改成非数字,报错了:
- 漏传参数,友好提示:
↑age_month参数漏传了。 - 将参数改为非必传(not required):
加上= None
- 谢谢!更多炫技待续。。。
websocket
页面 与springBoot相似 但是可以写在python文件内
html = """
<!DOCTYPE html>
<html>
<head>
<title>Chat</title>
</head>
<body>
<h1>向后端发送消息</h1>
<form action="" onsubmit="sendMessage(event)">
<input type="text" id="messageText" autocomplete="off"/>
<button>Send</button>
</form>
<ul id='messages'>
</ul>
<script>
var ws = new WebSocket("ws://localhost:8000/ws");
ws.onmessage = function(event) {
var messages = document.getElementById('messages')
var message = document.createElement('li')
var content = document.createTextNode(event.data)
message.appendChild(content)
messages.appendChild(message)
};
function sendMessage(event) {
var input = document.getElementById("messageText")
ws.send(input.value)
input.value = ''
event.preventDefault()
}
</script>
</body>
</html>
"""
后台
- 注入
from fastapi.responses import HTMLResponse
from fastapi import FastAPI, WebSocket
- 页面代理
# page
@app.get("/ws")
async def get():
print("%s" %('Went to websocket'))
return HTMLResponse(html)
- 收发消息
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True: # 如果为真,则消息来了
data = await websocket.receive_text()
# 收到消息后,再发出去
await websocket.send_text(f"发送的消息: {data}")
事件
@app.on_event("startup") # shutdown
async def init():
id_game_sort.append({"name": "Howard"})
id_game_sort.append({"name": "Lisan"})
@app.get("/sort/{id}")
async def getSort(id: int):
return id_game_sort[id]
input:http://localhost:8000/sort/1
output:{"name":"Lisan"}
配置
运行
端口
- –port=no.
高级功能
上传文件
安装依赖
pip3 install python-multipart
代码
import time
import uvicorn
from fastapi import FastAPI, File, UploadFile
@app.post("/api/upload_file")
async def file_upload(file: UploadFile = File(...)):
start = time.time()
try:
res = await file.read()
with open(file.filename, "wb") as f:
f.write(res)
return {"msg": "success", 'time': time.time() - start, 'data': file.filename, 'code': 200}
except Exception as e:
return {"msg": str(e), 'time': time.time() - start, 'data': file.filename, 'code': 500}
db
rdb 关系数据库
1、安装依赖
pip3 install sqlalchemy==1.4.22
pip3 install pymysql==1.0.2
2、代码
①、配置