基于Git的自动API版本控制:URL零改动
利用Django中间件与URL反转算法,根据请求的Accept头或查询参数自动路由到不同版本的视图,无需维护多个urls.py文件,且版本定义基于代码仓库标签。 · 难度:入门 · +10XP
声明式版本路由
传统做法复制整个视图集或使用命名空间,维护成本高。本教程创建一个VersionMap注册器,将视图函数与语义版本号关联。中间件解析客户端请求的版本(例如Accept: application/vnd.myapp.v2+json),然后动态替换视图函数。版本定义从Git tag读取,确保发布版本与代码标签一一对应。同时提供降级策略:请求v2但不存在时自动尝试v1。
# versioning/router.py
from functools import lru_cache
class VersionRouter:
_views = {}
@classmethod
def register(cls, version: str):
def wrapper(view_func):
cls._views.setdefault(version, []).append(view_func)
return view_func
return wrapper
@classmethod
def resolve(cls, requested_version, path):
versions = sorted(cls._views.keys(), reverse=True)
for v in versions:
if v <= requested_version:
# match path
...