Python的Fastapi框架中可以方便地使用Websocket,见官方文档:https://fastapi.tiangolo.com/advanced/websockets/ 但在使用websocket的时候碰到了报错,WARNING: Unsupported upgrade request.即当前的fastapi环境中并没有支持websocket的upgrade请求,客户端中的连接ws协议的js代码中也报错:handshake: Unexpected response code: 400。本文地址:http://8408.cn/article/977.html,未经许可,不得转载.
我的运行环境是uvicorn,是通过pip install uvicorn来安装,在之前开发API接口的时候一切正常,但在使用websockets时遇到了这个错误。是什么原因呢?原来通过pip install uvicorn来安装的uvicorn 0.12.2版本并没有带有websockets,要安装带有websockets功能的uvicorn需要使用pip install uvicorn[standard]来安装。解决方法先卸载再安装:本文地址:http://8408.cn/article/977.html,未经许可,不得转载.
$ pip uninstall uvicorn Found existing installation: uvicorn 0.12.2 Uninstalling uvicorn-0.12.2: Proceed (y/n)? y Successfully uninstalled uvicorn-0.12.2 $ pip install uvicorn[standard] Collecting uvicorn[standard] Downloading uvicorn-0.13.3-py3-none-any.whl (45 kB) Collecting websockets==8.*; extra == "standard" Downloading websockets-8.1-cp38-cp38-win_amd64.whl (66 kB) Installing collected packages: watchgod, websockets, uvicorn Successfully installed uvicorn-0.13.3 watchgod-0.6 websockets-8.1本文地址:http://8408.cn/article/977.html,未经许可,不得转载.
从上面可以看到在使用uvicorn[standard]时有明确的提示,我们同时安装了websockets-8.1。这是uvicorn[standard]与uvicorn的主要区别,但不仅仅只有这个区别,找到官网的相关介绍:https://pypi.org/project/uvicorn/本文地址:http://8408.cn/article/977.html,未经许可,不得转载.
$ pip install uvicorn[standard] This will install uvicorn with minimal (pure Python) dependencies. This will install uvicorn with "Cython-based" dependencies (where possible) and other "optional extras". In this context, "Cython-based" means the following: the event loop uvloop will be installed and used if possible. the http protocol will be handled by httptools if possible. Moreover, "optional extras" means that: the websocket protocol will be handled by websockets (should you want to use wsproto you'd need to install it manually) if possible. the --reloader flag in development mode will use watchgod. windows users will have colorama installed for the colored logs. python-dotenv will be installed should you want to use the --env-file option. PyYAML will be installed to allow you to provide a .yaml file to --log-config, if desired.本文地址:http://8408.cn/article/977.html,未经许可,不得转载.
从上面可以看到除了安装websockets外,在uvloop,http协议方面也有变化,还会自动增加对env文件的支持, 除此之外,还会对--reloader有影响,之前在进行开发时使用unicorn main:app启动项目添加 --reloader 选项从而实现项目热更新,而更换成了uvicorn[standard]之后,添加--reloader 选项启动项目会遇到项目一直报警:WARNING WatchGodReload detected file change in *.log文件(可能是我的日志文件在本地开发时放在项目代码里,把日志目录移到项目外估计就可以),从而导致项目一直循环重启。这是因为uvicorn[standard]的热加载是依赖于watchdog 模块, watchdog是github上的一个开源项目,采用观察者模式用于监控一个文件目录下的文件和文件夹的变动,从而实现热加载,和默认的--reloader机制不一样造成的。本文地址:http://8408.cn/article/977.html,未经许可,不得转载.
本文地址:http://8408.cn/article/977.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
手机扫码直接打开本页面 |