#django #django-rest-framework #drf-spectacular
Вопрос:
Я использую drf-spectacular для создания документации по API swagger/redoc.
Одна из самых полезных функций является возможность тестировать запросы с помощью создаваемого Swagger HTML-страницу, но я хотел бы реализовать приложение/х-www-формы-urlencoded типа контента, так что, когда запрос поступает на моем Джанго конечные точки запроса.сведения присвоен закодированные данные, а не его окончание как часть строки запроса. ДРФ-эффектный всегда кажется, что по умолчанию для строки запроса, например /объектов/действий/?ключ=значение
Единственный способ, которым я понял, как это сделать,-это использовать сериализатор в сочетании с типом содержимого запроса, например
@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):
...
Это отлично работает, но для этого требуется множество небольших сериализаторов, которые могут иметь только один или два атрибута. Есть ли альтернативный способ добиться этого внутри декоратора extend_schema?
Я надеялся, что сработает что-то вроде следующего, но не получается
request={'application/x-www-form-urlencoded': {'schema': {'foo_id': OpenApiTypes.INT}}},
Ответ №1:
Я думаю, что документация отвечает на этот вопрос. Вы можете использовать inline_serializer
для этих небольших одноразовых случаев. Это позволяет вам сделать это:
@extend_schema(responses={
'2XX': SimpleSerializer,
'401': inline_serializer('Error1', fields={'detail': serializers.CharField()}),
})
Это работает так же для @extend_schema(request=inline_serializer(...))
В крайнем случае, вы также можете поместить необработанную схему в request
или response
.
Примечание: Если вы хотите application/x-www-form-urlencoded
, чтобы вас обнаружили автоматически, просто сделайте это
@action(methods=['post'], detail=False, parser_classes=[parsers.FormParser])
Комментарии:
1. Спасибо. Я не могу поверить, что полностью пропустил это. В случае, если это кому-то поможет, необработанная схема, чтобы попытаться создать простой сериализатор, в итоге выглядела следующим образом, поэтому не очень полезно. запрос={‘приложение/json’: { «тип»: «объект», «свойства»: { «идентификатор»: { «тип»: «целое число», «формат»: «int64» }, }, «требуется»: [ «идентификатор», ], «пример»: { «идентификатор»: 123456789012345678 } } },