【问题标题】:Returning binary data with django HttpResponse使用 django HttpResponse 返回二进制数据
【发布时间】:2014-04-12 03:50:50
【问题描述】:

我试图让 Django 的 HttpResponse 返回二进制数据,但没有取得多大成功。一段时间以来,我一直在尝试不同的方法,但没有成功。

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

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

我很想得到一些反馈和帮助。

非常感谢!

-A-

【问题讨论】:

    标签: python django string binary httpresponse


    【解决方案1】:
    return HttpResponse(data, content_type='application/octet-stream')
    

    为我工作。

    【讨论】:

    • 好的答案解释并提供代码。考虑更新您的答案,以包含有关此代码如何工作以及为什么它是最佳选择的说明。
    • 所需导入:'from django.http import HttpResponse'
    • 只是想补充一点,在使用 Django、DRF、WeasyPrint 和 drf-pdf 的组合返回 PDF 文件时,这对我有很大帮助。我被 Unicode 错误弄疯了,发现用这一行替换我所有的废话就可以了!当然,octet-stream 可能不是适合我的情况的内容类型,但至少 API 可以正常工作,我只需要调整一个小问题。 :-)
    • 我收到TypeError: Object of type HttpResponse is not JSON serializable
    【解决方案2】:

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

    Base64 是一组类似的binary-to-text encoding 方案,通过将其转换为 radix-64 表示,以 ASCII 字符串格式表示二进制数据。

    由于 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)
    

    网络浏览器

    从 Django 获取data 后,可以使用base64 数据创建data 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);
    

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-02
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多