Microdot:一个Python Web框架
Microdot是一个轻量级的Python Web框架,其设计灵感来源于Flask,但旨在消除Flask中一些复杂(如应用/请求上下文)的部分。它最初是为在资源受限的MicroPython环境中运行而创建的,但同时也完全兼容标准的CPython。最新版本(2.0)已重构为100%异步。
核心特性
- 类Flask语法:使用装饰器定义路由,但更简洁直接,请求处理函数直接接收
request对象。
- 轻量与高效:模块化设计,核心代码仅约1.5K行,远小于Flask(约15.5K行)或FastAPI(约14.8K行)等主流框架(均含其核心依赖)。
- 双平台兼容:专为MicroPython设计,但也兼容CPython。
- 原生异步:基于
asyncio构建,支持异步处理函数。
- 现代功能支持:内置对WebSocket、服务器发送事件(SSE)、跨源资源共享(CORS)的支持。
- 模板渲染:支持Jinja(CPython)和uTemplate(MicroPython)模板引擎。
- 会话管理:使用经过加密签名的JWT存储用户会话。
- 灵活的服务器:在MicroPython上使用内置轻量级服务器,在CPython上可与任何ASGI/WSGI服务器集成。
- 自带测试客户端。
创建背景
作者在2019年使用MicroPython(一种面向微控制器的Python实现)为ESP8266微控制器开发项目时,发现缺少一个既轻量又类似Flask的Web框架。现有的Flask、Bottle等框架因体积过大无法在MicroPython上运行,而当时唯一的MicroPython框架picoweb又依赖非官方MicroPython分支。因此,Microdot应运而生,填补了MicroPython生态系统中轻量级Web框架的空白。
代码示例
Microdot的代码风格简洁明了。例如,定义一个简单的路由:
from microdot import Microdot
app = Microdot()
@app.get('/')
async def index(request):
return {'hello': 'world'}
app.run(debug=True)
它支持多种HTTP方法,返回字典可自动转换为JSON响应。路由可以通过mount方法进行组织。
对于WebSocket和SSE,通过装饰器即可实现:
@app.route('/echo')
@with_websocket
async def echo(request, ws):
while True:
data = await ws.receive()
await ws.send(data)
体积对比
Microdot的核心最小配置仅需一个文件(约728行代码),即使包含全部功能,也仅约1577行。与之相比,Flask连同其依赖Werkzeug总计约15558行,FastAPI连同Starlette约14808行。这意味着Microdot的代码量仅为后者的10%左右。
适用场景与建议
- MicroPython项目:强烈推荐使用,它是此类环境中功能完善且积极维护的Web框架。
- CPython项目:如果你追求极致的资源利用率(如减少内存占用以部署更多工作实例),可以考虑迁移到Microdot。但对于已有项目,如果当前框架运行良好,作者建议无需刻意迁移。它更适合作为新项目的备选方案。