赞
踩
FastAPI是一个高性能Web框架,性能有多高,据说与NodeJS和Go相当。如其名,FastAPI主要用于构建API。特别是其在接口开发的同时自动生成交互式api接口文档,可以直接在文档中进行接口调试,非常方便。另外FastApi是一个很新的python框架,最低要求python3.6版本。
框架主页:FastAPI
Github主页:GitHub - tiangolo/fastapi: FastAPI framework, high performance, easy to learn, fast to code, ready for production
框架安装很简单,
#安装fastapi框架
pip install fastapi
#安装server
pip install uvicorn
安装之后我们去新建一个main.py文件,引入Fastapi框架并定义两个方法,直接在方法上面使用app.get定义当前接口的URL请求路径,并且可以直接拿到路径中的参数,和java的注解开发一样。代码如下:
- #main.py文件,
- from typing import Optional
- from fastapi import FastAPI
- app = FastAPI()
- @app.get("/")
- async def read_root():
- return {"Hello": "World"}
-
- @app.get("/items/{item_id}")
- async def read_item(item_id: int, q: Optional[str] = None):
- return {"item_id": item_id, "q": q}
然后就开始启动python服务uvicorn,使用命令uvicorn main:app --reload。我这里使用的是Spyder,自带Ipython,我开始在Ipython中启动,总是报main位置的错:SyntaxError: invalid syntax,之后多次尝试无果在git bash去启动成功。呃,看来Ipython干不了这个。
- In [1] uvicorn main:app --reload
- File "<ipython-input-1-529978818c8b>", line 1
- uvicorn main:app --reload
- ^
- SyntaxError: invalid syntax
-
- #bash中启动uvicorn
- $ uvicorn main:app --reload
- INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
- INFO: Started reloader process [9196] using statreload
- INFO: Started server process [7056]
- INFO: Waiting for application startup.
- INFO: Application startup complete.
- INFO: 127.0.0.1:57231 - "GET /items/1231 HTTP/1.1" 200 OK
- INFO: 127.0.0.1:57232 - "GET /items/1231?q=arewq HTTP/1.1" 200 OK
然后就可以在浏览器中请求URL:http://127.0.0.1:8000/items/1231?q=arewq 直接得到响应json数据了。{"item_id":1231,"q":"arewq"} 确实是非常方便接口开发。另外直接访问URL: http://127.0.0.1:8000/docs 可以看到已经为我们生成了一个接口文档,可以在接口方法下面加注释会直接呈现在此页面中。点击右边的try it out 可直接在当前页面填写表单数据测试接口,截图如下:
WebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术,是HTML5的技术之一,放到现在也并不是一个多新鲜的东西,不过在没有WebSocket之前,要实现从服务器推消息给客户端确实觉得很别扭,比如使用轮询或者长连接的方式,这些方式都会增加客户端和服务端很多负担,都是一些间接的实现方案,但均不理想。
而WebSocket协议则是一个真正实现全双工通迅的东西,其也是基于TCP实现,也包含初始的握手过程,但初次握手后可以进行多次数据双向传输过程。
WebSocket接口的内容可以分为三类:状态变量、网络功能和消息处理等。
构造函数构造WebSocket对象,以及建立和服务器连接; protocols可选字段,代表选择的子协议
状态变量readyState: 代表当前连接的状态,短整型数据,取值为CONNECTING(值为0), OPEN(值为1), CLOSING(值为2), CLOSED(值为3)
方法变量close(code, reason): 关闭此WebSocket连接。
状态变量bufferedAmount: send函数调用后,被缓存并且未发送到网络上的数据长度
方法变量send(data): 将数据data通过此WebSocket发送到对端
回调函数onopen/onmessage/onerror/onclose: 当相应的事件发生时会触发此回调函数
以下是代码实现:
- #服务端的代码实现部分
- from typing import List
- from fastapi import FastAPI, WebSocket, WebSocketDisconnect
-
- app = FastAPI()
- class ConnectionManager:
- def __init__(self):
- self.active_connections: List[WebSocket] = []
-
- async def connect(self, ws: WebSocket):
- await ws.accept()
- self.active_connections.append(ws)
-
- def disconnect(self, ws: WebSocket):
- self.active_connections.remove(ws)
-
- @staticmethod
- async def send_personal_message(message: str, ws: WebSocket):
- await ws.send_text(message)
-
- async def broadcast(self, message: str):
- for connection in self.active_connections:
- await connection.send_text(message)
-
- manager = ConnectionManager()
-
- @app.websocket("/ws/{user}")
- async def websocket_endpoint(websocket: WebSocket, user: str):
- await manager.connect(websocket)
- await manager.broadcast(f"用户{user}进入聊天室")
-
- try:
- while True:
- data = await websocket.receive_text()
- await manager.send_personal_message(f"你说了: {data}", websocket)
- await manager.broadcast(f"用户:{user} 说: {data}")
-
- except WebSocketDisconnect:
- manager.disconnect(websocket)
- await manager.broadcast(f"用户-{user}-离开")
#客户端的代码实现部分
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>聊天1</title>
- </head>
- <body>
- <h1>User1 Chat</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://127.0.0.1:8010/ws/user1");
- 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>
要多个客户端就复制一下上面的客户端静态html文件,修改一下new WebSocket参数中最后的user1为user2即可。最后使用官方推荐如下启动方式启动python服务,然后即可在浏览器上实现实时聊天。
$ uvicorn main:app --host="127.0.0.1" --port=8010 --reload
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。