我正在调用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})
有没有办法做到这一点?
答案 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()