news 2026/8/24 11:37:24

Lumi进阶实战:自定义路由与GET/POST/PUT/PATCH请求方法配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lumi进阶实战:自定义路由与GET/POST/PUT/PATCH请求方法配置指南

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 方法与其它三种方法在参数传递上有本质区别,新手最容易踩坑:

  1. 参数必须放在查询字符串(Query String)中,因为 GET 不支持请求体;
  2. 所有参数到达函数时都是字符串类型,需要在函数内部自行转换。
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请求成功执行一切正常
400Bad Request缺少函数必需参数 / JSON 解析失败
404Not Found该路由下没有绑定对应方法的函数
405Method Not Allowed使用了 GET/POST/PUT/PATCH 以外的方法(如 DELETE)
415Unsupported Media TypePOST/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 应用

总结:三步完成自定义路由与方法配置

  1. 改路由app.register(函数, route="/自定义路径")
  2. 改方法app.register(函数, request_method=RequestMethod.GET)
  3. 处理参数:GET 请求走查询串并手动转换类型;POST/PUT/PATCH 走 JSON 请求体

至此,你已经掌握了 Lumi 自定义路由与请求方法配置的全部核心技巧。Lumi 的核心代码量非常小,配合 lumi/init.py 导出的LumiRequestMethod两个入口,几分钟就能把任意 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 11:34:36

数学建模竞赛非理想条件应对:从数据噪声到多目标优化的实战策略

1. 项目概述:从“理想”到“现实”的跨越数学建模竞赛进行到第三天,尤其是面对第二题,很多队伍会陷入一个典型的困境:模型在理想条件下跑得飞快,结果漂亮得像个艺术品,可一旦把题目里那些“非理想条件”加进…

作者头像 李华
网站建设 2026/8/24 11:33:34

OpenHands 部署教程:如何快速搭起自托管 AI 编码智能体控制台

OpenHands 部署教程:如何快速搭起自托管 AI 编码智能体控制台 【免费下载链接】OpenHands 🙌 OpenHands: AI-Driven Development 项目地址: https://gitcode.com/GitHub_Trending/ope/OpenHands OpenHands Agent Canvas 是一个自托管的 AI 编码智…

作者头像 李华
网站建设 2026/8/24 11:30:19

DeepSeek V4-Flash-Vision-Exp视觉模型实战:从API接入到智能体开发

最近在跟进大模型技术动态时,发现 DeepSeek 发布了一款名为V4-Flash-Vision-Exp的实验性视觉模型,其官方公布的智能体基准测试成绩直接对标了业界顶尖的 Claude 3.5 Opus 4.8。这无疑在 AI 开发者社区投下了一颗重磅炸弹。对于正在探索多模态应用、智能体…

作者头像 李华
网站建设 2026/8/24 11:29:52

暗黑2存档编辑器d2s-editor完全指南:3分钟改出理想角色

暗黑2存档编辑器d2s-editor完全指南:3分钟改出理想角色 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor 是一款免费开源的暗黑破坏神2存档编辑器,在浏览器里直接读写 .d2s 存档文件&#xff0c…

作者头像 李华
网站建设 2026/8/24 11:29:50

基于AI Agent的自动化短剧生成:从概念到实践

如果你还在为制作一部AI短剧而头疼——需要分别寻找剧本生成、角色设计、分镜绘制、视频剪辑、配音配乐等不同工具,然后在各个软件间反复切换、导出导入,那么这篇文章就是为你准备的。传统AI短剧制作流程像一场“抽卡游戏”:你需要在不同的AI…

作者头像 李华
网站建设 2026/8/24 11:29:13

SAP物料特性值查询:CLAF_CLASSIFICATION_OF_OBJECTS函数详解与实战

1. 从一次物料主数据查询的“卡壳”说起 在SAP的物料管理(MM)或生产计划(PP)模块里,我们经常会遇到一个场景:需要根据物料的某些特性(比如颜色、尺寸、等级)来筛选或处理数据。比如&…

作者头像 李华