You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:47:09