生成动态QR码的实践与优化

张开发
2026/6/7 18:11:14 15 分钟阅读
生成动态QR码的实践与优化
在现代Web开发中生成和展示QR码是常见的需求尤其是在电子商务、门票系统和产品追踪等领域。本文将详细介绍如何在React前端与Django后端之间高效地传输和展示QR码数据并解决一些常见的坑点。后端Django部分在Django后端我们使用qrcode库来生成QR码。我们的目标是避免将QR码图像保存到服务器上而是将数据直接传输到前端。代码示例fromdjango.httpimportJsonResponsefromioimportBytesIOimportqrcodeimportbase64fromrest_framework.viewsimportAPIViewfromrest_framework.responseimportResponsefromrest_frameworkimportstatusfrom.modelsimportSoftwareclassgenerateQR(APIView):defget(self,request,software_id):try:softwareSoftware.objects.get(idsoftware_id)locationsoftware.location.all()name_locations[l.nameforlinlocation]qr_data{kcm:software.kcm,name:software.name,admin:software.admin.name,location:name_locations,}qrqrcode.QRCode(version1,error_correctionqrcode.constants.ERROR_CORRECT_L,box_size10,border4,)qr.add_data(qr_data)qr.make(fitTrue)imgqr.make_image(fill_colorblack,back_colorwhite)# 将QR码图像转为base64编码bufferBytesIO()img.save(buffer,formatPNG)img_base64base64.b64encode(buffer.getvalue()).decode(utf-8)returnResponse({qr:img_base64},statusstatus.HTTP_200_OK)exceptSoftware.DoesNotExist:returnResponse({error:Software not found},statusstatus.HTTP_404_NOT_FOUND)exceptExceptionase:returnResponse({error:str(e)},statusstatus.HTTP_500_INTERNAL_SERVER_ERROR)前端React部分在前端我们需要将从后端接收到的base64编码的数据转换成图像并显示在页面上。代码示例importReact,{useState}fromreact;importaxiosfromaxios;constQRCodeGenerator({softwareId}){const[qrCode,setQRCode]useState(null);constgenerateQRCodeasync(){try{constresponseawaitaxios.get(/api/software/${softwareId}/genQR/);constbinaryDataStringatob(response.data.qr);constbyteNumbersnewArray(binaryDataString.length);for(leti0;ibinaryDataString.length;i){byteNumbers[i]binaryDataString.charCodeAt(i);}constbyteArraynewUint8Array(byteNumbers);constblobnewBlob([byteArray],{type:image/png});consturlURL.createObjectURL(blob);setQRCode(url);}catch(error){console.error(Error generating QR code:,error);}};return(div{qrCodeimg src{qrCode}altQR Code/}button onClick{generateQRCode}GenerateQRCode/button/div);};exportdefaultQRCodeGenerator;实践中的挑战与解决方案避免服务器保存图像通过使用BytesIO和base64编码我们能够在内存中处理QR码图像避免了磁盘IO操作。数据传输和解析后端编码使用base64.b64encode将图像数据编码为base64字符串方便通过API传输。前端解码使用atob将base64字符串转换回二进制数据然后创建Blob对象并生成URL。确保数据完整性确保base64字符串在传输过程中不被截断或损坏。在前端处理base64数据时注意编码字符的正确性避免字符编码问题导致的图像损坏。通过这种方法我们不仅提升了应用的性能还简化了系统架构减少了对服务器存储的依赖。希望本文对您在项目中实现类似的功能有所帮助

更多文章