如何使用drf-spectacular为Server-Sent Event编写文档
迁移drf-yasg的SSE文档到drf-spectacular
以下是对应drf-spectacular的实现代码,完全匹配你原drf-yasg的文档效果:
from drf_spectacular.utils import extend_schema, OpenApiResponse from rest_framework.decorators import api_view, renderer_classes from django.http import StreamingHttpResponse # 假设你的EventStreamRenderer已定义完成 class EventStreamRenderer(BaseRenderer): media_type = 'text/event-stream' format = 'event-stream' def event_stream(): # 你的流数据生成逻辑 yield "data: {'field1': 'demo', 'field2': 'value'}\n\n" @api_view(["GET"]) @renderer_classes([EventStreamRenderer]) @extend_schema( tags=['2. Server Sent Events'], produces=['text/event-stream'], consumes=['text/event-stream'], responses={ 200: OpenApiResponse( description="text/event-stream", examples=[ { 'media_type': 'text/event-stream', 'value': "data: { " "'field1': '', " "'field2': '', " "'field3': '', " "'field4': '', " "}" } ] ) } ) def data_stream(request): response = StreamingHttpResponse(event_stream(), content_type="text/event-stream") response['Cache-Control'] = 'no-cache' return response
关键转换说明
- 移除自定义
SwaggerAutoSchema类:drf-spectacular无需通过自定义Schema类指定produces和consumes,直接在extend_schema中传入对应参数即可。 - 响应结构替换:将drf-yasg的
openapi.Response替换为drf-spectacular的OpenApiResponse,示例数据通过examples参数传递,每个示例需明确media_type和value。 - 装饰器简化:将原单独赋值的
swagger_info直接作为装饰器绑定到视图函数,更贴合drf-spectacular的常规写法。
内容的提问来源于stack exchange,提问作者Ricardo
相关产品推荐
相关产品推荐

