diff --git a/docs/blueprints.rst b/docs/blueprints.rst index 47cef692..46110a31 100644 --- a/docs/blueprints.rst +++ b/docs/blueprints.rst @@ -103,3 +103,19 @@ Framework ones adding separated serializers for read and write operations. __ https://github.com/vintasoftware/drf-rw-serializers .. literalinclude:: blueprints/drf_rw_serializers.py + +drf-extra-fields Base64FileField +-------------------------------- + +`drf-extra-fields`__ provides a ``Base64FileField`` and ``Base64ImageField`` that automatically +represent binary files as base64 encoded strings. This is a useful way to embed files within a +larger JSON API and keep all data within the same tree and served with a single request or +response. + +Because requests to these fields require a base64 encoded string and responses can be either a +URI or base64 contents (if ``represent_as_base64=True``) custom schema generation +logic is required as this differs from the default DRF ``FileField``. + +.. literalinclude:: blueprints/drf_extra_fields.py + +__ https://github.com/Hipo/drf-extra-fields diff --git a/docs/blueprints/drf_extra_fields.py b/docs/blueprints/drf_extra_fields.py new file mode 100644 index 00000000..718fbc95 --- /dev/null +++ b/docs/blueprints/drf_extra_fields.py @@ -0,0 +1,20 @@ +from drf_spectacular.extensions import OpenApiSerializerFieldExtension +from drf_spectacular.plumbing import build_basic_type +from drf_spectacular.types import OpenApiTypes + + +class Base64FileFieldSchema(OpenApiSerializerFieldExtension): + target_class = "drf_extra_fields.fields.Base64FileField" + + def map_serializer_field(self, auto_schema, direction): + if direction == "request": + return build_basic_type(OpenApiTypes.BYTE) + elif direction == "response": + if self.target.represent_in_base64: + return build_basic_type(OpenApiTypes.BYTE) + else: + return build_basic_type(OpenApiTypes.URI) + + +class Base64ImageFieldSchema(Base64FileFieldSchema): + target_class = "drf_extra_fields.fields.Base64ImageField"