使用Django HttpResponse返回二进制数据

use*_*420 3 python string django binary httpresponse

我正在尝试让Django的HttpResponse返回二进制数据,但没有成功。我已经尝试了一段时间的不同方法,但没有成功。

只要二进制数据值不在ASCII字符范围(小于0-255)的范围内,就可以将字符串编码为ASCII。使用latin-1进行编码时也发生了同样的情况。

创建字节字符串效果很好,但是如果包含某些值,则创建失败,例如,如果我在数据中包含以下字节:“ \ xf6 \ x52”,结果将得到不同的字节。由于某种原因,当我尝试查看结果响应时,第一个字节\ xf6被转换为0xfffd。

我希望获得一些反馈并为此提供帮助。

非常感谢!

-一种-

sad*_*v30 5

return HttpResponse(data, content_type='application/octet-stream')
Run Code Online (Sandbox Code Playgroud)

为我工作。

  • 很好的解释*并提供代码。考虑更新您的答案,以包括有关此代码如何工作以及为什么它是最佳选择的说明。 (3认同)

Chr*_*ert 5

从 Django 返回二进制数据的一种灵活方法是首先使用Base64对数据进行编码。

Base64 是一组类似的二进制到文本的编码方案,通过将 ASCII 字符串格式的二进制数据转换为 radix-64 表示形式来表示二进制数据。

由于 Base64 编码的数据是 ASCII,因此默认的 HTTP 响应内容类型text/html; charset=utf-8可以正常工作。

图片示例

姜戈

import base64
from io import BytesIO

from django.http import HttpRequest, HttpResponse
import PIL.Image


def image_test(request: HttpRequest) -> HttpResponse:
    file_stream = BytesIO()
    image_data = PIL.Image.open('/path/to/image.png')
    image_data.save(file_stream)
    file_stream.seek(0)
    base64_data = base64.b64encode(file_stream.getvalue()).decode('utf-8')
    return HttpResponse(base64_data)
Run Code Online (Sandbox Code Playgroud)

网页浏览器

从 Django获取后data,base64 数据可用于创建数据 URL


// `data` fetched from Django as Base64 string
const dataURL = `data:image/png;base64,${data}`;
const newImage = new Image();
newImage.src = dataURL;
$('#ImageContainer').html(newImage);
Run Code Online (Sandbox Code Playgroud)

JSON 响应

Base64 数据也可以作为 JSON 响应的一部分返回:

import base64
from io import BytesIO

from django.http import HttpRequest, JsonResponse
import PIL.Image

def image_test(request: HttpRequest) -> JsonResponse:
    file_stream = BytesIO()
    image_data = PIL.Image.open('/path/to/image.png')
    image_data.save(file_stream)
    file_stream.seek(0)
    base64_data = base64.b64encode(file_stream.getvalue()).decode('utf-8')
    json_data = dict()
    json_data['base64Data'] = base64_data
    return JsonResponse(json_data)
Run Code Online (Sandbox Code Playgroud)