# RuntimeError: 响应已开始，无法设置头。

- **ID:** `python/starlette-middleware-response-already-started`
- **领域:** python
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

中间件在 `await send(message)` 已发送 `http.response.start` 后尝试修改头。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| 0.30+ | active | — | — |

## 解决方案

1. **** (95% 成功率)
   ```
   async def __call__(self, scope, receive, send):
    async def send_wrapper(message):
        if message['type'] == 'http.response.start':
            message['headers'].append((b'x-custom', b'1'))
        await send(message)
    await self.app(scope, receive, send_wrapper)
   ```
2. **** (90% 成功率)
   ```
   from starlette.middleware.base import BaseHTTPMiddleware
class M(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        resp = await call_next(request)
        resp.headers['x-custom'] = '1'
        return resp
   ```

## 无效尝试

- **** — Headers are silently missing; client sees wrong behavior. (85% 失败率)
- **** — State flag doesn't alter ASGI message ordering. (95% 失败率)
