Django Rest框架-返回图像作为响应

Aru*_* SS 1 python django django-views django-rest-framework

我正在调用 django Rest 框架 get api 来创建条形码。当我尝试将其另存为图像时,它工作正常。

@api_view(['GET'])
def mybarcode(request):
    from elaphe import barcode

        code = barcode('datamatrix', "sampletext",
                       encoding='utf-8', scale=2,
                       options=dict(columns=24, rows=24),
                       margin=2, data_mode='50bits')
        code.save("mybarcode.jpg")
        return Response({'status': True})
Run Code Online (Sandbox Code Playgroud)

当我将此 API 称为“ http://127.0.0.1:9999/api/v1/testbarcode ”时,效果很好。将创建一个名为“mybarcode.jpg”的图像,并且 api 返回其状态为 True。

但我想返回图像作为此 api 调用的结果。因为我必须将其包含在图像标签中。

<img src='http://127.0.0.1:9999/api/v1/testbarcode' />
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?

Chr*_*ris 5

我用它来返回会员的二维码:

@staticmethod
def qr_code(request, member_id):
    m = Member.objects.get(id=member_id)
    response = HttpResponse(m.generate_qrcode())
    response['Content-Type'] = "image/png"
    response['Cache-Control'] = "max-age=0"
    return response
Run Code Online (Sandbox Code Playgroud)

在 Member 类上调用它:

def generate_qrcode(self):
    qr = qrcode.QRCode(
        version=2,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=4,
        border=0,
    )
    qr.add_data(self.formatted_id())
    qr.make(fit=True)

    img = qr.make_image()

    buffer = BytesIO()
    img.save(buffer)

    return buffer.getbuffer()
Run Code Online (Sandbox Code Playgroud)

这样就不会接触磁盘,尽管我认为它会在更高的并发情况下占用内存。