Encode the data returning a two tuple of (bytes, content_type)
(self, data, format=None, content_type=None)
| 131 | super().__init__(**defaults) |
| 132 | |
| 133 | def _encode_data(self, data, format=None, content_type=None): |
| 134 | """ |
| 135 | Encode the data returning a two tuple of (bytes, content_type) |
| 136 | """ |
| 137 | if data is None: |
| 138 | return (b'', content_type) |
| 139 | |
| 140 | assert format is None or content_type is None, ( |
| 141 | 'You may not set both `format` and `content_type`.' |
| 142 | ) |
| 143 | |
| 144 | if content_type: |
| 145 | try: |
| 146 | data = self._encode_json(data, content_type) |
| 147 | except AttributeError: |
| 148 | pass |
| 149 | |
| 150 | # Content type specified explicitly, treat data as a raw bytestring |
| 151 | ret = force_bytes(data, settings.DEFAULT_CHARSET) |
| 152 | |
| 153 | else: |
| 154 | format = format or self.default_format |
| 155 | |
| 156 | assert format in self.renderer_classes, ( |
| 157 | "Invalid format '{}'. Available formats are {}. " |
| 158 | "Set TEST_REQUEST_RENDERER_CLASSES to enable " |
| 159 | "extra request formats.".format( |
| 160 | format, |
| 161 | ', '.join(["'" + fmt + "'" for fmt in self.renderer_classes]) |
| 162 | ) |
| 163 | ) |
| 164 | |
| 165 | # Use format and render the data into a bytestring |
| 166 | renderer = self.renderer_classes[format]() |
| 167 | ret = renderer.render(data) |
| 168 | |
| 169 | # Determine the content-type header from the renderer |
| 170 | content_type = renderer.media_type |
| 171 | if renderer.charset: |
| 172 | content_type = "{}; charset={}".format( |
| 173 | content_type, renderer.charset |
| 174 | ) |
| 175 | |
| 176 | # Coerce text to bytes if required. |
| 177 | if isinstance(ret, str): |
| 178 | ret = ret.encode(renderer.charset) |
| 179 | |
| 180 | return ret, content_type |
| 181 | |
| 182 | def get(self, path, data=None, **extra): |
| 183 | r = { |