大家好,我是木木。
今天给大家分享一个实用的 Python 库,daphne。
daphne
它是 Django Channels 团队维护的 ASGI 服务器,专门处理 HTTP、HTTP/2 与 WebSocket,适合把异步 Web 服务稳定地跑起来。
项目地址:https://github.com/django/daphne官方文档:https://channels.readthedocs.io
三大特点
协议全
它同时覆盖 HTTP、HTTP/2 与 WebSocket,适合需要一个入口承接传统请求和实时连接的服务。对 ASGI 应用来说,切换协议时不需要换一套部署思路。
上手快
命令行非常直接,指向 module:application 就能启动服务。对于正在从 WSGI 迁移到 ASGI 的团队,这种低门槛部署方式尤其友好。
工程稳
它基于 Twisted 生态实现,背后又有 Django / Channels 团队长期维护。做线上服务时,稳定的日志、明确的启动参数和成熟依赖链,比“新奇”更重要。
最佳实践
先安装依赖。本文实测环境里直接安装 daphne,它会一并带上 ASGI 运行所需的核心依赖。
python3-mvenv.venvsource.venv/bin/activatepipinstalldaphnerequestswebsockets
示例 1:启动一个最小 HTTP 服务
这段代码解决的是“我怎样最快确认 daphne 已经把 ASGI 应用跑起来”。我们定义一个最小 HTTP 应用,返回请求方法、路径和查询参数,便于调试接入层。
# app.pyimportjsonfromurllib.parseimportparse_qsasyncdefapplication(scope,receive,send):ifscope['type']=='http':whileTrue:message=awaitreceive()ifmessage['type']=='http.request'andnotmessage.get('more_body',False):breakquery={k:viflen(v)>1elsev[0]fork,vinparse_qs(scope.get('query_string',b'').decode()).items()}data=json.dumps({'method':scope['method'],'path':scope['path'],'query':query,'message':'hello from daphne',},ensure_ascii=False,indent=2).encode()awaitsend({'type':'http.response.start','status':200,'headers':[(b'content-type',b'application/json; charset=utf-8')],})awaitsend({'type':'http.response.body','body':data})
daphne-b127.0.0.1-p8011app:applicationcurl'http://127.0.0.1:8011/hello?name=木木&lang=python'
示例 2:给挂在子路径的应用设置 root path
这段代码解决的是“服务部署在 /forum 这类反向代理前缀下时,应用怎样拿到正确的根路径”。daphne 原生支持 --root-path,适合放到 Nginx 或网关后面时做路径适配。
daphne-b127.0.0.1-p8012--root-path/forumapp:applicationcurl'http://127.0.0.1:8012/forum/status?check=1'
环境与版本信息
高级功能
示例 3:用一个服务同时承接 WebSocket 连接
这段代码解决的是“同一个 ASGI 进程里,怎样同时处理实时连接”。很多聊天室、看板推送、运维控制台都需要这一能力。示例里 WebSocket 收到消息后立即回显,并附带大写版本,方便验证双向通信链路。
# app.py 中补充 websocket 分支elifscope['type']=='websocket':awaitsend({'type':'websocket.accept'})whileTrue:message=awaitreceive()ifmessage['type']=='websocket.receive':text=message.get('text','')awaitsend({'type':'websocket.send','text':json.dumps({'echo':text,'upper':text.upper(),'path':scope['path'],},ensure_ascii=False),})elifmessage['type']=='websocket.disconnect':return
importasyncioimportwebsocketsasyncdefmain():asyncwithwebsockets.connect('ws://127.0.0.1:8013/ws/chat')asws:awaitws.send('ping from websocket')print(awaitws.recv())asyncio.run(main())
进阶场景里要注意两点:第一,WebSocket 长连接更依赖反向代理的超时与转发配置;第二,如果你准备启用 HTTP/2,需要额外安装 Twisted 的 tls / http2 extras,并结合 TLS 端点启动。
适用
- Django Channels、Starlette、FastAPI 等 ASGI 应用需要统一接入 HTTP 与 WebSocket。
- 内网实时控制台、消息推送面板、协作工具这类长连接场景。
- 从 WSGI 迁移到 ASGI,想先用独立服务器验证部署链路。
- 需要明确 root path、socket、fd 等启动参数的工程化部署环境。
不适用
- 只有简单同步接口、且现有 WSGI 链路已经足够稳定的小项目。
- 团队对 ASGI 生命周期、反向代理和长连接运维没有准备时。
- 想直接依赖 HTTP/2 高级特性但又不愿处理 TLS / 证书配置的场景。
- 追求“一把梭”全家桶部署,而不是清晰拆分应用与网关职责的团队。
上线检查
- 确认反向代理是否正确透传 WebSocket 与
root_path。 - 若要启用 HTTP/2,提前验证 OpenSSL、TLS 证书和 Twisted extras。
- 检查 ASGI 应用的超时、日志和优雅关闭策略,避免长连接泄漏。
总结
daphne 的价值不在“花哨”,而在它把 ASGI 服务最核心的 HTTP 与 WebSocket 接入做得直接、稳定、可落地。