如何在Python中利用责任链模式处理API请求校验

秋辰大大_4435

秋辰大大_4435

2026-11-08

185人浏览

原创

责任链模式适合API需动态组合多个解耦校验步骤的场景,如鉴权→参数格式→业务规则→频控;不适用于强依赖原子校验或纯同步中间件。

如何在python中利用责任链模式处理api请求校验

责任链模式在API校验中适合什么场景

当你的API需要依次执行多个互不耦合的校验逻辑(比如鉴权 → 参数格式 → 业务规则 → 频控),且不同接口启用的校验项不同,或者某些校验需动态跳过时,责任链比硬编码 if-elif 或装饰器堆叠更易维护。它不适用于单次强依赖的原子校验(如 JWT 解析失败必须终止),也不适合纯同步阻塞型中间件(如 Django 的 middleware 已足够)。

用 Handler 类实现可插拔校验节点

每个校验步骤封装为继承自基类的 Handler 实例,关键在于统一接口和链式传递控制权。不要把所有逻辑塞进一个 handle() 方法里,而是让每个子类只关心「自己是否处理」和「是否继续传递」:

class Handler:
    def __init__(self, next_handler: 'Handler' = None):
        self.next = next_handler
<pre class="brush:php;toolbar:false;">def handle(self, request: dict) -> bool:
    raise NotImplementedError

class AuthHandler(Handler): def handle(self, request: dict) -> bool: token = request.get("headers", {}).get("Authorization") if not token: request["error"] = "Missing Authorization header" return False

验证通过,交给下一个

    return self.next.handle(request) if self.next else True

class SchemaHandler(Handler): def handle(self, request: dict) -> bool: try: json.loads(request.get("body", "{}")) except json.JSONDecodeError: request["error"] = "Invalid JSON body" return False return self.next.handle(request) if self.next else True

  • 每个 handle() 返回 bool:表示「当前环节是否放行」,False 即刻中断链
  • 不要在 handle() 内抛异常来控制流程——这会让调用方难捕获具体哪一环失败
  • request 是可变字典,用于透传上下文(如提取后的 user_id、解析后的参数),但避免写入无关字段

构建链时注意顺序与短路行为

链的组装顺序直接影响校验优先级和性能。高频失败项(如缺失 token)应前置,避免浪费资源做后续校验;而耗时操作(如查 DB)尽量后置或做成可选分支。

# 正确:先轻量校验,再重操作
validator = AuthHandler(
    SchemaHandler(
        BusinessRuleHandler(
            RateLimitHandler()
        )
    )
)
<h1>错误:把 DB 查询放在最前,每次请求都触发</h1><p>validator = DBUserLookupHandler(SchemaHandler(...))
</p>
  • 用构造函数传参方式组装链,比用 set_next() 方法更清晰、更易单元测试
  • 如果某个环节可能被开关控制(如灰度期跳过频控),不要删节点,而是让其 handle() 直接返回 self.next.handle(request)(即透明转发)
  • Python 中没有尾递归优化,深层链(>10 层)可能触发 RecursionError,生产环境建议限制最大深度或改用循环遍历

集成到 FastAPI/Flask 路由时怎么传参

别把整个 Request 对象丢进链——框架的 Request 是不可变或带异步状态的。应提前提取你需要的字段,构造成 plain dict:

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
@app.post("/order")
async def create_order(request: Request):
    # 提前解包,不传原始 Request 实例
    payload = {
        "method": request.method,
        "headers": dict(request.headers),
        "body": await request.body(),
        "query_params": dict(request.query_params),
        "user_id": None,  # 后续 handler 可填充
    }
<pre class="brush:php;toolbar:false;">if not validator.handle(payload):
    raise HTTPException(status_code=400, detail=payload["error"])

return {"user_id": payload["user_id"], "status": "ok"}

  • FastAPI 的 request.body() 是 bytes,不是字符串,SchemaHandler 要用 json.loads(body.decode())
  • 不要在 handler 里调用 await —— 同步链无法等待协程。如需异步校验(如 Redis 频控),得把整个链改成 async/await 风格,或用线程池包装
  • 错误信息统一挂载到 request 字典的 "error" 键下,便于上层统一响应格式,而不是各 handler 自己 raise

链越长,调试越难定位是哪个 handler 挂掉的。上线前务必给每个 handler 加日志,至少记录「进入」「跳过」「中断」三种状态,别只靠 error 字段反推。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1891

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5204

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1829

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

31397

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3707

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3727

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1263

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2883

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程