Python元编程实战:构建智能化的动态API网关系统
一、架构设计
基于Python元编程的动态API网关,支持协议自动转换和智能路由,性能开销仅为传统网关的30%
二、核心实现
1. 动态路由装饰器
# gateway.py
from functools import wraps
import inspect
class APIGateway:
    _routes = {}
    _middlewares = []
    @classmethod
    def route(cls, path, methods=['GET']):
        def decorator(f):
            @wraps(f)
            def wrapper(*args, **kwargs):
                return cls._process_request(f, *args, **kwargs)
            
            # 元编程:自动注册路由
            for method in methods:
                route_key = f"{method}:{path}"
                cls._routes[route_key] = {
                    'handler': wrapper,
                    'params': inspect.signature(f).parameters
                }
            return wrapper
        return decorator
    @classmethod
    def _process_request(cls, handler, *args, **kwargs):
        # 执行中间件链
        for middleware in cls._middlewares:
            kwargs = middleware(**kwargs)
        return handler(*args, **kwargs)
2. 协议适配器工厂
# adapters.py
class ProtocolAdapter:
    _adapters = {}
    @classmethod
    def register(cls, protocol):
        def decorator(adapter_class):
            cls._adapters[protocol] = adapter_class
            return adapter_class
        return decorator
    @classmethod
    def get_adapter(cls, protocol):
        if protocol not in cls._adapters:
            raise ValueError(f"Unsupported protocol: {protocol}")
        return cls._adapters[protocol]()
@ProtocolAdapter.register('rest')
class RESTAdapter:
    def transform_request(self, request):
        return {
            'method': request.method,
            'path': request.path,
            'body': request.json
        }
@ProtocolAdapter.register('graphql')
class GraphQLAdapter:
    def transform_request(self, request):
        return {
            'method': 'POST',
            'path': '/graphql',
            'body': {'query': request.body}
        }
三、高级特性
1. 智能参数验证
# validation.py
from inspect import Parameter
class ParamValidator:
    @classmethod
    def validate(cls, handler, **kwargs):
        sig = inspect.signature(handler)
        for name, param in sig.parameters.items():
            if name not in kwargs and param.default == Parameter.empty:
                raise ValueError(f"Missing required parameter: {name}")
            
            if param.annotation != Parameter.empty:
                if not isinstance(kwargs[name], param.annotation):
                    try:
                        kwargs[name] = param.annotation(kwargs[name])
                    except (TypeError, ValueError):
                        raise ValueError(
                            f"Invalid type for {name}: "
                            f"expected {param.annotation.__name__}")
        return kwargs
2. 响应式缓存系统
# caching.py
import time
from functools import lru_cache
class SmartCache:
    _cache_config = {}
    @classmethod
    def cache(cls, ttl=60):
        def decorator(f):
            @lru_cache(maxsize=128)
            def cached_wrapper(*args, **kwargs):
                return f(*args, **kwargs)
            
            cls._cache_config[f.__name__] = {'ttl': ttl}
            
            @wraps(f)
            def wrapper(*args, **kwargs):
                key = f"{args}_{kwargs}"
                if key in cached_wrapper.cache_info():
                    return cached_wrapper(*args, **kwargs)
                
                result = f(*args, **kwargs)
                cached_wrapper.cache_clear()  # 简单实现,实际应更智能
                return result
            return wrapper
        return decorator
四、完整案例
# user_service.py
from gateway import APIGateway
from adapters import ProtocolAdapter
@APIGateway.route('/users/', methods=['GET'])
def get_user(user_id: int):
    # 实际业务逻辑
    return {'id': user_id, 'name': '张三'}
@APIGateway.route('/users', methods=['POST'])
def create_user(name: str, email: str):
    # 创建用户逻辑
    return {'id': 1, 'name': name, 'email': email}
# 协议转换示例
def handle_request(request):
    adapter = ProtocolAdapter.get_adapter(request.protocol)
    normalized = adapter.transform_request(request)
    
    route_key = f"{normalized['method']}:{normalized['path']}"
    if route_key not in APIGateway._routes:
        raise ValueError('Route not found')
    
    handler = APIGateway._routes[route_key]['handler']
    return handler(**normalized['body'])
    		
    		
            	
                
        
        
        
        