gmc*_*051 2 django django-rest-framework drf-spectacular
我正在使用drf-spectaulous生成 swagger/redoc API 文档。
最有用的功能之一是能够通过生成的 swagger html 页面测试请求,但我想强制执行application/x-www-form-urlencoded内容类型,以便当我的 Django 端点收到请求时,request.data具有编码数据,而不是最终作为查询字符串的一部分。drf-spectaulous 似乎总是默认查询字符串,例如/objects/action/?key=value
我想出如何做到这一点的唯一方法是将序列化器与请求内容类型结合使用,例如
@extend_schema(
request={'application/x-www-form-urlencoded': DoTheActionInputsSerializer},
responses={200: DoTheActionOutputsSerializer},
methods=["POST"]
)
@action(methods=['post'], detail=False)
def do_the_action(self, request, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
这很有效,但它确实需要大量可能只有一两个属性的小型序列化器。在extend_schema装饰器中是否有其他方法可以实现这一点?
我希望像下面这样的东西会起作用,但没有
request={'application/x-www-form-urlencoded': {'schema': {'foo_id': OpenApiTypes.INT}}},
Run Code Online (Sandbox Code Playgroud)
小智 5
我认为文档回答了这个问题。您可以用于inline_serializer那些一次性的小案例。它允许您执行以下操作:
@extend_schema(responses={
'2XX': SimpleSerializer,
'401': inline_serializer('Error1', fields={'detail': serializers.CharField()}),
})
Run Code Online (Sandbox Code Playgroud)
这同样适用于@extend_schema(request=inline_serializer(...))
作为最后的手段,您还可以将原始模式字典放入request or中response。
注意:如果你想application/x-www-form-urlencoded被自动检测到,只需执行
@action(methods=['post'], detail=False, parser_classes=[parsers.FormParser])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3143 次 |
| 最近记录: |