什么是FastAPI
高性能的python的web框架
使用ASGI为引擎
pip install fastapi
pip install uvicorn
http使用1.1协议
FastAPI体量很小,需要自己安装一些扩展插件丰富功能
如:jinja2,websocket等
例子1-与前端使用http协议进行交互
main.py
from fastapi import FastAPI#主类
from starlette.responses import HTMLResponse#starlette插件库
from starlette.requests import Request
from starlette.staticfiles import StaticFiles#寻静态文件
from starlette.templating import Jinja2Templates#寻模板文件
import uvicorn as u
app=FastAPI()
app.mount("/statics",StaticFiles(directory="statics"),name="statics")#设定静态文件地址和名字,可在前端直接使用设定值
templates = Jinja2Templates(directory="templates")#设定模板文件路径
@app.get("/")#前端请求地址
async def Read_root(request:Request):#使用异步函数回复请求
comlist=serialcom.Port()
return templates.TemplateResponse("login.html",{"request": request,"comlist":comlist})
#静态加载,加载数据,前端使用{{}}接收数据,数据传comlist入login.html中,要注意数据要么在前端加过滤器tojson转换,要么在后台json转换
@app.post("/serialcom/{app_name}/")#设计地址变量app_name
async def get_fun(app_name:serialcom.ModelName,data:serialcom.Name_serial):
if app_name==serialcom.ModelName.CSerial:
dat=data.dict()
print(dat['context'])
df={"message":[1,2,3,4]}
return {"model_name":app_name, "data": df}
login.html
...
context={"context":}向后传的数据设计必须如此,要对应后端设计的数据变量名
$ajax({
url:"/serialcom/CSerial/",
type:"get",
data:JSON.stringify(context),建议加上该函数,避免格式或译码错误,
success:function(res){
console.log(res["data"]["message"][1]);
},
});
...
ModelName
from enum import Enum
class ModelName(str,Enum):#设计变量对应路径名
CSerial='CSerial'
Name_serial
from pydantic import BaseModel
class Name_serial(BaseModel):#设计http请求数据的变量
context:dict
例子2-使用websocket协议
from fastapi import FastAPI
from starlette.responses import HTMLResponse
from starlette.websockets import WebSocket
app = FastAPI()
html = """
<!DOCTYPE html>
<html>
<head>
<title>Chat</title>
</head>
<body>
<h1>WebSocket Chat</h1>
<form action="" οnsubmit="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>
"""
# @app.get("/")告诉FastAPI如何去处理请求
# 路径 /
# 使用get操作
@app.get("/")
async def get():
# 返回表单信息
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"Message text was: {data}")#向前端发送数据