当前位置:   article > 正文

Python高性能Web框架FastApi及其安装使用 及 Fastapi框架使用Websocket实现即时通迅功能_python fastapi websocket

python fastapi websocket

一、Python高性能Web框架FastApi及其安装使用

    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的注解开发一样。代码如下:

  1. #main.py文件,
  2. from typing import Optional
  3. from fastapi import FastAPI
  4. app = FastAPI()
  5. @app.get("/")
  6. async def read_root():
  7. return {"Hello": "World"}
  8. @app.get("/items/{item_id}")
  9. async def read_item(item_id: int, q: Optional[str] = None):
  10. return {"item_id": item_id, "q": q}

     然后就开始启动python服务uvicorn,使用命令uvicorn main:app --reload。我这里使用的是Spyder,自带Ipython,我开始在Ipython中启动,总是报main位置的错:SyntaxError: invalid syntax,之后多次尝试无果在git bash去启动成功。呃,看来Ipython干不了这个。

  1. In [1] uvicorn main:app --reload
  2. File "<ipython-input-1-529978818c8b>", line 1
  3. uvicorn main:app --reload
  4. ^
  5. SyntaxError: invalid syntax
  6. #bash中启动uvicorn
  7. $ uvicorn main:app --reload
  8. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
  9. INFO: Started reloader process [9196] using statreload
  10. INFO: Started server process [7056]
  11. INFO: Waiting for application startup.
  12. INFO: Application startup complete.
  13. INFO: 127.0.0.1:57231 - "GET /items/1231 HTTP/1.1" 200 OK
  14. 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 可直接在当前页面填写表单数据测试接口,截图如下:

二、Fastapi框架使用Websocket实现即时通迅功能

    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: 当相应的事件发生时会触发此回调函数

以下是代码实现:

  1. #服务端的代码实现部分
  2. from typing import List
  3. from fastapi import FastAPI, WebSocket, WebSocketDisconnect
  4. app = FastAPI()
  5. class ConnectionManager:
  6. def __init__(self):
  7. self.active_connections: List[WebSocket] = []
  8. async def connect(self, ws: WebSocket):
  9. await ws.accept()
  10. self.active_connections.append(ws)
  11. def disconnect(self, ws: WebSocket):
  12. self.active_connections.remove(ws)
  13. @staticmethod
  14. async def send_personal_message(message: str, ws: WebSocket):
  15. await ws.send_text(message)
  16. async def broadcast(self, message: str):
  17. for connection in self.active_connections:
  18. await connection.send_text(message)
  19. manager = ConnectionManager()
  20. @app.websocket("/ws/{user}")
  21. async def websocket_endpoint(websocket: WebSocket, user: str):
  22. await manager.connect(websocket)
  23. await manager.broadcast(f"用户{user}进入聊天室")
  24. try:
  25. while True:
  26. data = await websocket.receive_text()
  27. await manager.send_personal_message(f"你说了: {data}", websocket)
  28. await manager.broadcast(f"用户:{user} 说: {data}")
  29. except WebSocketDisconnect:
  30. manager.disconnect(websocket)
  31. await manager.broadcast(f"用户-{user}-离开")

#客户端的代码实现部分

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>聊天1</title>
  6. </head>
  7. <body>
  8. <h1>User1 Chat</h1>
  9. <form action="" onsubmit="sendMessage(event)">
  10. <input type="text" id="messageText" autocomplete="off"/>
  11. <button>Send</button>
  12. </form>
  13. <ul id='messages'>
  14. </ul>
  15. <script>
  16. var ws = new WebSocket("ws://127.0.0.1:8010/ws/user1");
  17. ws.onmessage = function(event) {
  18. var messages = document.getElementById('messages')
  19. var message = document.createElement('li')
  20. var content = document.createTextNode(event.data)
  21. message.appendChild(content)
  22. messages.appendChild(message)
  23. };
  24. function sendMessage(event) {
  25. var input = document.getElementById("messageText")
  26. ws.send(input.value)
  27. input.value = ''
  28. event.preventDefault()
  29. }
  30. </script>
  31. </body>
  32. </html>

    要多个客户端就复制一下上面的客户端静态html文件,修改一下new WebSocket参数中最后的user1为user2即可。最后使用官方推荐如下启动方式启动python服务,然后即可在浏览器上实现实时聊天。

$ uvicorn main:app --host="127.0.0.1" --port=8010 --reload	
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号