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

时间:2018-05-29 10:50:28

标签: python django django-rest-framework django-views

我正在调用django rest框架获取api来创建条形码。当我试图将其保存为图像时,它的工作正常。

GROUP BY

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

但我想通过此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})

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:2)

应避免在Django视图中返回图像/文件。 Web服务器NGINX / Apache善于处理它们。

将映像保存在存储中,如本地磁盘,AWS S3或其他云存储。然后根据存储的位置渲染图像。

如果是本地存储,可以使用Web服务器进行传送。存储在AWS S3中的图像可以通过AWS CDN Cloudfront提供。

答案 1 :(得分:0)

最简单的方法是在响应中返回图像。我不熟悉这个库,但根据你的代码,如果你只是将你的回报改为:

return HttpResponse(code, content_type='application/octet-stream')

答案 2 :(得分:0)

将图片转换为base64

import base64
def(yourimagefile):
     with open(yourimagefile, "rb") as image_file:
         base64string = base64.b64encode(image_file.read())
         return base64string

在创建图像后挂钩此模块并更改html以显示base64内容

答案 3 :(得分:0)

我用它来返回会员的QR码:

@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

在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()

尽管我认为它会以更高的并发占用内存,但这种方式不会碰到磁盘。

答案 4 :(得分:0)

仍然有太多代码。简化:

import io
import segno

def generate_qrcode(self):
    buffer = io.BytesIO()
    segno.make(self.formatted_id(), version=2, error='h') \
         .save(buffer, kind='png', scale=4, border=0)
    return buffer.getvalue()