)
后端【免费下载链接】hugEmbrace the APIs of the future. Hug aims to make developing APIs as simple as possible, but no simpler.项目地址https://gitcode.com/gh_mirrors/hu/hug点击查看免费下载本指南以 hug 仓库的 EXTENDING.md 为核心骨架讲解如何为 hug 构建、命名、测试并注册扩展extension。无论你想为 hug 新增一种类型type、接入一种新的认证方式authentication、定制输入/输出格式input/output format还是实现全局校验器、变换器或中间件本文都会给出从工程组织到发布注册的完整路径并结合 hug/types.py、hug/authentication.py、hug/output_format.py、hug/input_format.py、hug/transform.py、hug/validate.py、hug/middleware.py 等核心源码剖析每种扩展能力背后的实现机制让读者既能照着写也能真正理解其工作原理。一、hug 扩展的本质先是一个普通的 Python 包EXTENDING.md 开宗明义hug 扩展应当按照任何普通 Python 项目的方式构建并发布到 PyPI。它之所以能被称为 hug 扩展决定性因素只有两点命名包名以hug_前缀开头方便在 PyPI 上被检索发现内容包内包含用于扩展 hug 能力的工具类与函数utilities and classes that extend hugs capabilities。换句话说hug 对扩展几乎没有侵入式要求——你不需要继承某个框架基类也不需要遵循特殊目录约定只需发布一个普通 Python 包并在包内正确利用 hug 暴露的扩展点。hug 之所以能做到这一点与它把各扩展能力模块独立组织的设计密切相关在 hug/init.py 中types、authentication、input_format、output_format、transform、validate、middleware、directives等模块被逐一导入并作为公共 API 暴露这正是外部扩展可以按模块各取所需的入口。二、命名规范让用户在 PyPI 上一眼看到能力扩展的包名直接决定它的可发现性。EXTENDING.md 规定所有 hug 扩展必须以hug_开头在此基础上可以按功能选用更精确的前缀来指引用户理解扩展的用途。下表完整继承自 EXTENDING.md并补充了对应的源码模块参考前缀适用场景文档示例对应 hug 源码模块hug_types_主要为 hug 新增类型hug_types_numpyhug/types.pyhug_authentication_主要为 hug 新增认证方式hug_authentication_oath2hug/authentication.pyhug_output_format_主要为 hug 新增输出格式hug_output_format_svghug/output_format.pyhug_input_format_主要为 hug 新增输入格式hug_input_format_htmlhug/input_format.pyhug_validate_主要为 hug 新增整体校验器hug_validate_no_nullhug/validate.pyhug_transform_主要为 hug 新增变换器hug_transform_add_timehug/transform.pyhug_middleware_为 hug 新增中间件hug_middleware_redis_sessionhug/middleware.py对于更复杂或通用的场景——比如同时涉及多种能力——直接使用hug_前缀即可。EXTENDING.md 以hug_geo为例一个地理相关的扩展可以同时提供 types、input formats 和 output formats此时简单的hug_前缀比强行套用单一能力前缀更合适。注意前缀只是建议性的命名约定并不强制校验。它解决的是用户如何在海量 PyPI 包中快速判断一个包是不是 hug 扩展、能做什么的问题。三、七类扩展能力的源码级实现要点命名只是第一步。要让扩展真正生效关键在于正确使用 hug 各模块暴露的扩展点。下面按前缀分类逐一给出源码依据与最小可用的实现思路。3.1 新增类型hug_types_/hug.type与hug.typeshug 的类型系统以可调用对象为核心。在 hug/types.py 中一切类型的基类是Type第 47-60 行它约定用函数注解annotation标记参数类型子类必须重写__call__方法在其中完成值转换 校验校验失败时应抛出异常通常是ValueErrorhug 会将其转换为 API 层的错误响应。为了降低扩展门槛hug 提供了两个工厂方法hug.types.create(...)hug/types.py基于装饰器语义创建新类型支持doc、error_text、exception_handlers、chain、accept_context等参数并会自动生成带异常兜底与错误文案的__call__实现hug.types.accept(kind, ...)hug/types.py最轻量的方式——直接把任意 Python 类型转换函数包装为可用的 hug 类型注解。内置类型的定义就是现成的范式例如 hug/types.pynumber accept(int, A whole number, Invalid whole number provided) float_number accept(float, A float number, Invalid float number provided) boolean accept(bool, Providing any value will set this to true, Invalid boolean value provided) uuid accept(native_uuid.UUID, A Universally Unique IDentifier, Invalid UUID provided)一个自定义类型的典型写法如下例如假设要做一个hug_types_风格的扩展新增版本号类型# 包内模块示例 from hug import type type(error_textInvalid version string provided) def version_string(value): A semantic version string, e.g. 1.2.3 parts value.split(.) if not all(part.isdigit() for part in parts): raise ValueError(value) return tuple(int(part) for part in parts)若需支持参数化类型如types.Multiple[types.text]、DelimitedList源码中通过SubTyped元类实现下标语法hug/types.py扩展同样可以借鉴__getitem__的写法为自定义类型提供泛型能力。此外Multi任一类型通过即可、OneOf/Mapping枚举取值、InRange/LessThan/GreaterThan/Length数值与长度约束、JSON解析 JSON 数据等内置类型都集中在 hug/types.py可作为功能对照清单。3.2 新增认证方式hug_authentication_与authenticator认证扩展的核心是hug.authentication模块的authenticator装饰器hug/authentication.py。其约定非常清晰被authenticator包裹的认证函数接收request、response并通过**kwargs获得verify_user回调verify_user接受凭证如 API key认证成功返回用户对象失败返回 falsy 值authenticator包装后成功时会把用户对象写入request.context[user]失败时根据result is None缺凭证或result is False凭证无效抛出HTTPUnauthorized并附带challenges挑战头。内置的两种认证方式即标准范例basichug/authentication.py解析Authorization: Basic ...头base64 解码出user_id:key调用verify_user(user_id, key)api_keyhug/authentication.py读取X-Api-Key请求头调用verify_user(api_key)。文档示例hug_authentication_oath2即指实现 OAuth2 类型的认证函数。自建认证扩展的骨架可以这样组织# 示例包内 authentication.py from hug.authentication import authenticator authenticator def token_auth(request, response, verify_user, **kwargs): Bearer Token Authentication token request.get_header(Authorization) if token and token.lower().startswith(bearer ): token token.split( , 1)[1] user verify_user(token) if user: return user return False return None # 无凭证 - HTTPUnauthorized使用时把认证函数传给路由装饰器的requires参数即可例如hug.get(requirestoken_auth)。3.3 新增输出格式hug_output_format_与output_format输出格式是把 API 返回值转换为响应体的函数。内置实现集中在 hug/output_format.py包括json、text、html、pretty_json、json_camelcase、图片/视频处理器、file等。其中两个机制对扩展至关重要content_type装饰器来自 hug/format.py在 hug/output_format.py 中被大量使用为输出函数声明 MIME 类型例如content_type(application/json; charsetutf-8)on_valid(content_type, on_invalidjson)hug/output_format.py当数据结构中出现errors键时自动切换到错误格式用于校验失败返回错误格式的语义。文档示例hug_output_format_svg可以借助image工厂快速实现——事实上 hug/output_format.py 就是用循环为IMAGE_TYPES中每种格式动态生成xxx_image处理器的svg_image正源于此。一个输出格式扩展的最小形态# 示例包内 output_format.py from hug.format import content_type content_type(application/x-yaml; charsetutf-8) def yaml(content, **kwargs): YAML (Yet Another Markup Language) import yaml as yaml_lib return yaml_lib.safe_dump(content).encode(utf8)更进阶的用法包括用on_content_type(handlers, default...)按请求 Content-Type 选择处理器hug/output_format.py用output_format.accept(handlers)/suffix/prefix按客户端可接受类型或 URL 后缀/前缀分发hug/output_format.py。若想让自定义对象在 JSON 序列化时自动转换可以用json_convert(kind)注册全局转换器hug/output_format.py内置的 numpy 系列转换即为范例。3.4 新增输入格式hug_input_format_与input_format输入格式负责把请求体解析为 Python 对象。内置实现位于 hug/input_format.pytext按 charset 解码、json解析 JSON 为原生对象、json_underscoreJSON 键名转下划线风格、urlencoded解析查询字符串、multipart解析 multipart 表单。它们统一使用content_type装饰器声明适用的请求媒体类型。文档示例hug_input_format_html的扩展思路即注册一个解析 HTML 请求体的处理器。骨架如下# 示例包内 input_format.py from hug.format import content_type content_type(text/html) def html(body, charsetutf-8, **kwargs): Takes HTML formatted data from bs4 import BeautifulSoup return BeautifulSoup(body.read().decode(charset), html.parser)3.5 新增整体校验器hug_validate_与validate校验器与类型不同类型针对单个参数值而校验器针对整个请求字段集。内置实现位于 hug/validate.py包括validate.all(*validators)全部通过才成功hug/validate.pyvalidate.any(*validators)任一通过即成功hug/validate.pyvalidate.contains_one_of(*fields)保证多个可选字段中至少有一个被设置hug/validate.py。文档示例hug_validate_no_null对应的实现模式是接收字段字典fields对其中值为空的字段返回{字段名: 错误信息}结构。一个自建校验器的示例# 示例包内 validate.py def no_null(fields): Ensures no passed in field is null errors {} for field, value in fields.items(): if value is None or value : errors[field] must not be null return errors使用时通过路由装饰器的validate参数传入可配合hug.validate.all(...)组合多个校验器。3.6 新增变换器hug_transform_与transform变换器transformer用于在输出前后对数据进行统一处理。内置实现位于 hug/transform.py提供transform.content_type(transformers, defaultNone)按请求 Content-Type 选择变换器hug/transform.pytransform.suffix(...)/transform.prefix(...)按 URL 后缀/前缀选择hug/transform.pytransform.all(*transformers)依次应用全部变换器hug/transform.py。文档示例hug_transform_add_time即给数据追加时间戳这类通用变换。骨架示例# 示例包内 transform.py from datetime import datetime def add_time(data, requestNone, responseNone): Adds a timestamp to the output data if isinstance(data, dict): data[served_at] datetime.utcnow().isoformat() return data3.7 新增中间件hug_middleware_与middleware中间件用于在请求处理生命周期中注入横切逻辑。内置实现 hug/middleware.py 中的SessionMiddleware是一个完整范本其构造参数store、context_name、cookie_name及一系列cookie_*参数定义了会话中间件的可配置面并通过process_request加载会话注入request.context与process_response保存会话并下发 cookie两个钩子接入请求生命周期。文档示例hug_middleware_redis_session即用 Redis 存储实现该会话中间件的get/exists/set三个方法hug/middleware.py 的文档明确约定了 store 对象必须实现的接口。自建中间件只需定义这两个钩子# 示例包内 middleware.py class TimingMiddleware(object): Adds a simple response header recording request processing time. def process_request(self, request, response): import time request.context[_start] time.time() def process_response(self, request, response, resource, req_succeeded): import time start request.context.get(_start) if start is not None: response.set_header(X-Processing-Time, str(time.time() - start))注册方式为hug.middleware_class(TimingMiddleware)该装饰器在 hug/init.py 中作为公共 API 导出。四、构建建议参照 hug 自身的工程标准EXTENDING.md 建议扩展尽可能按 hug 自身的方式构建并给出四项工程标准100% 测试覆盖率pytesthug 本身就是高度依赖测试驱动的项目仓库tests/目录包含 test_types.py、test_authentication.py、test_output_format.py、test_validate.py、test_transform.py 等对应模块的完整测试套件——扩展开发者可以参照这些测试文件为各自能力编写等价覆盖不错的性能decent performance类型转换、输出格式化处于每次请求的热路径上应避免引入无谓的开销PEP8 合规保证代码风格统一、可读可选地内置 Cython 编译hug 自身支持 Cython 加速扩展若同样提供可编译路径性能敏感用户会更有信心。需要强调这四项均非强制要求它们的价值在于给用户这个扩展不会拖慢我的服务、不会意外破坏环境的信心。五、注册与发布让扩展被整个生态发现开发并测试完毕后扩展需要被注册以便他人发现。EXTENDING.md 给出两个注册层级发布到 PyPI与任何普通 Python 包无异。结合本仓库的 setup.py、setup.cfg、pyproject.toml 与 requirements、tox.ini 等打包/构建配置可以推断出标准流程大致为配置好包元数据与依赖 → 本地构建python -m build→ 上传发布twine upload dist/*登记到 hug 官方扩展清单将扩展补充到 hug 项目在 GitHub Wiki 上维护的Hug-Extensions列表中进一步提高被检索与发现的机会。六、生态共建扩展是 hug 长期演进的基石EXTENDING.md 在结尾向每一位扩展作者表达了诚挚的感谢每一个用心开发并注册的扩展都在让 hug 的生态更加完整也为未来 API 基础设施打牢地基。这也是本项目设计哲学的延伸——正如 hug/init.py 所述的设计目标让 API 开发像写定义一样简洁并拥抱最新技术。扩展机制正是这一哲学的落地通道hug 核心保持精简把能力的横向扩张交给开放、标准的扩展协议。阅读延伸本文对应的官方指南原文位于 EXTENDING.md各能力模块的实现细节可继续阅读 hug/types.py、hug/authentication.py、hug/input_format.py、hug/output_format.py、hug/transform.py、hug/validate.py、hug/middleware.py配套测试用例集中在 tests 目录此外仓库中的 documentation/AUTHENTICATION.md、documentation/TYPE_ANNOTATIONS.md、documentation/OUTPUT_FORMATS.md、documentation/CUSTOM_CONTEXT.md 分别对认证、类型注解、输出格式与中间件上下文做了深入讲解可配合本指南交叉阅读。赞分享后端【免费下载链接】hugEmbrace the APIs of the future. Hug aims to make developing APIs as simple as possible, but no simpler.项目地址https://gitcode.com/gh_mirrors/hu/hug点击查看免费下载相关推荐Resque 插件开发指南从规范、命名到 Hook 扩展的完整实践Resque 插件开发指南从规范、命名到 Hook 扩展的完整实践 导读 Resque 是一款基于 Redis 的 Ruby 后台任务库它鼓励开发者通过插件任务调度消息队列后端SillyTavern TTS 扩展 Provider 接口开发指南从 readme 规范到源码级实现剖析SillyTavern TTS 扩展 Provider 接口开发指南从 readme 规范到源码级实现剖析 本文以 SillyTavern 仓库中 TTS 扩人工智能AI 应用交互助手前端Avalonia Zafiro 开发命名与编码规范指南从命名、字段约定到基于 Result 的错误处理体系Avalonia Zafiro 开发命名与编码规范指南从命名、字段约定到基于 Result 的错误处理体系 本篇指南以 naming standards.mdAI 技能AI 插件上一篇AWS SAM 安全 Lambda 部署Safe Lambda Deployments完全指南基于 CodeDeploy 的渐进式流量切换与自动回滚下一篇VR-reversal 3D转2D播放器踩坑实录硬件加速失效、播放卡顿与画质调节的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考