starlette笔记、和fastapi的区别 文章目录starlette示例解读遇到的问题点fastapi都很熟悉那么starlette又是什么呢?一行公式搞定fastapi starlettepydanticopenapi文档路由参数校验starlette是fastapi的底层实现。starlette示例前提pycharm项目解释器、虚拟环境已准备好。1、安装依赖pip install fastapi# 安装fastapi时会自动带上starlette2、创建main.py代码# main.pyfromstarlette.applicationsimportStarlettefromstarlette.responsesimportJSONResponsefromstarlette.routingimportRoute,WebSocketRoutefromstarlette.middleware.corsimportCORSMiddlewarefromstarlette.endpointsimportWebSocketEndpointimportuvicorn# 1. 定义普通的 HTTP 视图函数带路径参数asyncdefuser_detail(request):# 从请求中解析动态路径参数 /user/{user_id}user_idrequest.path_params.get(user_id)returnJSONResponse({user_id:user_id,name:fUser-{user_id},message:Hello from Starlette!})# 2. 定义 WebSocket 服务端点classChatWebSocket(WebSocketEndpoint):encodingtext# 消息编码格式asyncdefon_connect(self,websocket):awaitwebsocket.accept()# 接受客户端连接awaitwebsocket.send_text(连接成功)asyncdefon_receive(self,websocket,data):# 收到客户端消息后回复awaitwebsocket.send_text(f服务端收到你的消息{data})asyncdefon_disconnect(self,websocket,close_code):pass# 客户端断开连接时的处理逻辑# 3. 定义路由表routes[Route(/user/{user_id:int},endpointuser_detail,methods[GET]),WebSocketRoute(/ws,ChatWebSocket)]# 4. 初始化 Starlette 应用并添加 CORS 中间件appStarlette(debugTrue,routesroutes)app.add_middleware(CORSMiddleware,allow_origins[*],# 允许所有来源allow_methods[*],# 允许所有 HTTP 方法allow_headers[*]# 允许所有请求头)# 5. 启动入口if__name____main__:uvicorn.run(main:app,host0.0.0.0,port8000,reloadTrue)3、运行main.py4、浏览器输入http://127.0.0.1:8000/user/123看到如下内容即为成功。{user_id:123,name:User-123,message:Hello from Starlette!}解读发现没有app.add_middleware等代码很熟悉fastapi中也有用因为底层本来就是starlette。遇到的问题点这块代码遇到点疑问这个websocket是哪里传的呢?是WebSocketEndpoint的属性吗?classChatWebSocket(WebSocketEndpoint):encodingtext# 消息编码格式asyncdefon_connect(self,websocket):awaitwebsocket.accept()# 接受客户端连接awaitwebsocket.send_text(连接成功)后来发现自己理解错了正确的答案应该是websocket是方法的入参但是websocket不一定是类的属性也可以是方法中的临时变量asyncdefon_connect(self,websocket):awaitwebsocket.accept()# 接受客户端连接awaitwebsocket.send_text(连接成功)在这里on_connect()是重写了父类的方法。看源码知道websocket是__call__方法里面的一个临时变量。