Lumi进阶实战:自定义路由与GET/POST/PUT/PATCH请求方法配置指南
【免费下载链接】lumiLumi is an nano framework to convert your python functions into a REST API without any extra headache.项目地址: https://gitcode.com/gh_mirrors/lu/lumi
Lumi 是一个极简的 Python 框架,能把你的 Python 函数直接变成 REST API 服务,几乎零学习成本。本文面向新手,手把手讲解 Lumi 进阶实战中的两大核心能力:自定义路由与GET/POST/PUT/PATCH 请求方法配置,帮助你在 5 分钟内掌握 Lumi 自定义路由技巧。
一分钟回顾:函数如何变成 API
在开始进阶内容前,先回顾 Lumi 的基本工作方式。你只需要写一个普通 Python 函数,再通过app.register()注册,Lumi 就会自动把它映射成一个可访问的 REST 端点:
# app.py from lumi import Lumi def add(a, b): return a + b app = Lumi() app.register(add) app.runServer(host="127.0.0.1", port=8080)启动服务后,默认生成的 API 信息为:
| 项目 | 默认值 |
|---|---|
| 端点 | 127.0.0.1:8080 |
| 路由 | /add(与函数名相同) |
| 请求方法 | POST |
| 请求体示例 | {"a": 1, "b": 2} |
也就是说:默认情况下,路由名 = 函数名,请求方法 = POST。接下来我们就打破这两个默认规则。
自定义路由:route 参数让函数名与路由解耦
在实际项目中,你常常不希望暴露函数名(比如函数叫add,但 API 路径想用/addition)。Lumi 提供了route参数来覆盖默认路由:
app.register(add, route="/addition")一行代码,函数add就绑定到了/addition上。关于路由的几个小细节(逻辑位于 lumi/api.py 的register方法中):
- ✅ 路由名不带前导斜杠也能识别:
route="addition"与route="/addition"效果一致,Lumi 会自动补上/ - ✅尾部斜杠会被自动去掉:
route="/addition/"最终注册为/addition - ⚠️ 同一个路由在不同请求方法下可以分别绑定不同函数(后面会用到这一点)
# 测试自定义路由 curl -X POST -H "Content-Type: application/json" \ -d '{"a": 1, "b": 2}' http://127.0.0.1:8080/addition响应保持统一的四字段结构:
{ "exit_code": 0, "status_code": 200, "result": 3, "error": "" }GET/POST/PUT/PATCH:四种请求方法配置指南
Lumi 通过request_method参数指定路由绑定的请求方法,取值来自 lumi/enums.py 中定义的RequestMethod枚举,支持GET、POST、PUT、PATCH四种方法:
from lumi import Lumi, RequestMethod app = Lumi() def add(a, b): return a + b # 不传参数时,默认注册为 POST 方法 app.register(add) # 为 GET 方法注册 app.register(add, request_method=RequestMethod.GET) # 为 PUT 方法注册 app.register(add, request_method=RequestMethod.PUT) # 为 PATCH 方法注册 app.register(add, request_method=RequestMethod.PATCH) app.runServer()📌 由于路由表是按「请求方法 → 路由 → 函数」分层的(见 lumi/api.py 中function_routing_map的结构),你可以让同一个路由在不同方法下调用同一个或不同的函数,非常适合按 REST 语义拆分接口。
GET 请求的两条特别注意
GET 方法与其它三种方法在参数传递上有本质区别,新手最容易踩坑:
- 参数必须放在查询字符串(Query String)中,因为 GET 不支持请求体;
- 所有参数到达函数时都是字符串类型,需要在函数内部自行转换。
def add(a, b): # 注意:GET 请求下 a、b 都是字符串,需要手动转换 return int(a) + int(b) app.register(add, request_method=RequestMethod.GET)# 参数通过 URL 查询串传递 curl "http://127.0.0.1:8080/add?a=1&b=2"查询参数的解析实现在 lumi/helpers.py 的parseQueryParameter函数中,它会把QUERY_STRING转换成键值对字典再传入函数。
POST/PUT/PATCH 的统一规则
这三种方法共享一套参数规则(见 lumi/api.py 中wsgi_app的校验逻辑):
- 参数通过JSON 请求体传递,例如
{"a": 1, "b": 2} - 请求头必须为
Content-Type: application/json,否则返回415 Unsupported Media Type - 缺少函数必需的参数时返回400 Bad Request
# PUT 方法示例 curl -X PUT -H "Content-Type: application/json" \ -d '{"a": 1, "b": 2}' http://127.0.0.1:8080/add💡 语义建议:POST用于创建、PUT用于整体替换、PATCH用于局部更新,Lumi 不做强制限制,由你按 REST 规范自行设计。
状态码速查表:快速定位 API 问题
| 状态码 | 含义 | 常见原因 |
|---|---|---|
| 200 | 请求成功执行 | 一切正常 |
| 400 | Bad Request | 缺少函数必需参数 / JSON 解析失败 |
| 404 | Not Found | 该路由下没有绑定对应方法的函数 |
| 405 | Method Not Allowed | 使用了 GET/POST/PUT/PATCH 以外的方法(如 DELETE) |
| 415 | Unsupported Media Type | POST/PUT/PATCH 请求的 Content-Type 不是 application/json |
| 500 | 函数执行出错 | 函数内部抛出异常,error字段会给出错误信息 |
响应中的exit_code字段用于程序化判断:0表示无错误,1表示执行出错。
进阶小技巧
- 生产环境关闭调试:
app = Lumi(debug=False)可关闭终端日志打印,避免暴露内部路由信息(debug参数定义于 lumi/api.py 的构造函数) - 函数直接返回文件对象:函数
return open("file.txt", "rb")即可让 API 以附件形式下发文件 - 本地开发服务:
app.runServer()底层使用 waitress 启动开发服务器(见 lumi/server.py),生产环境建议用 Gunicorn 管理,因为 Lumi 本身就是一个标准 WSGI 应用
总结:三步完成自定义路由与方法配置
- 改路由:
app.register(函数, route="/自定义路径") - 改方法:
app.register(函数, request_method=RequestMethod.GET) - 处理参数:GET 请求走查询串并手动转换类型;POST/PUT/PATCH 走 JSON 请求体
至此,你已经掌握了 Lumi 自定义路由与请求方法配置的全部核心技巧。Lumi 的核心代码量非常小,配合 lumi/init.py 导出的Lumi与RequestMethod两个入口,几分钟就能把任意 Python 函数发布为规范的 REST API。
【免费下载链接】lumiLumi is an nano framework to convert your python functions into a REST API without any extra headache.项目地址: https://gitcode.com/gh_mirrors/lu/lumi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考