python-图片流传输的思路及示例(url转换二维码)
1.场景
- 将URL动态生成二维码前端展示(微信支付等,)--》
1.静态文件路径访问
返回URL_name,(a标签,src静态路由访问)
2.流传输,前端渲染
二进制流返回前端,前端根据二进制流编码类型显示
3.前端js生成
后台获取到微信支付的code_url,前端js将code_url生成二维码,并渲染
- 实际代码
使用python_web框架--》tornado
manager.py
importos importasyncio importtornado.ioloop importtornado.httpserver importtornado.web importtornado.options fromtornado.optionsimportdefine,options,parse_command_line fromappsimportUrlHandler,Url2Handler,Url3Handler define("port",default=8000,type=int) defcreate_app(): settings={ "template_path":os.path.join(os.path.dirname(__file__),"templates"), "static_path":os.path.join(os.path.dirname(__file__),"static"), } application=tornado.web.Application( handlers=[ (r"/url",UrlHandler), (r"/url2",Url2Handler), (r"/url3",Url3Handler), ], debug=True, **settings, ) returnapplication if__name__=='__main__': parse_command_line() app=create_app() server=tornado.httpserver.HTTPServer(app) server.listen(options.port) asyncio.get_event_loop().run_forever()
apps.py
importtornado.web frommanager_handlerimportgen_qrcode,gen_qrcode_obj,gen_qrcode_buf classBaseHandler(tornado.web.RequestHandler): pass classUrlHandler(BaseHandler): defget(self): #获取链接 self.render('qrcode.html',title='url',data='URL-提交',img_stream='') asyncdefpost(self): #生成二维码 url=self.get_argument('url_str') #URL转换二维码 img_stream=gen_qrcode(url) awaitself.render('qrcode.html',title='qrcode',data='扫码支付',img_stream=img_stream) classUrl2Handler(BaseHandler): defget(self): #获取链接 self.render('qrcode.html',title='url',data='URL-提交',img_stream='') asyncdefpost(self): #生成二维码 url=self.get_argument('url_str') #URL转换二维码 img_stream=gen_qrcode_obj(url=url) #awaitself.render('qrcode.html',title='qrcode',data='扫码支付',img_stream=img_stream) self.set_header('Content_Type','image/jpg') self.set_header('Content_length',len(img_stream)) self.write(img_stream) classUrl3Handler(BaseHandelr): defget(self): self.render('qrcode.html',title='url',data='URL-提交',img_stream='') defpost(self): url=self.get_argument('url') img_stream=gen_qrcode_buf(url) self.set_header('Content-Type','image/png') self.write(img_stream)
manager_handler.py
importqrcode importio importbase64 importtime defgen_qrcode(url): """ 方式1:URL转换二维码 :paramurl:转换二维码的URL :return:base64编码后的二进制流二维码数据 """ qr=qrcode.make(url) buf=io.BytesIO() qr.save(buf) img_buf=buf.getvalue() img_stream=base64.b64encode(img_buf) returnimg_stream defgen_qrcode_obj(version=1,box_size=10,border=4,url=None): """ 方式2:URL转换二维码(图片流传输,template需要指明data:base64编码) :paramversion: :parambox_size: :paramborder: :return: """ qr=qrcode.QRCode( version=version, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=box_size, border=border, ) url="https://www.12dms.com"ifurlisNoneelseurl save_name="./"+"qrcode"+str(time.time())+".png" qr.add_data(url) qr.make() img=qr.make_image() img.save(save_name.encode()) withopen(save_name,'rb')asimg_f: img_stream=img_f.read() img_stream=base64.b64encode(img_stream) print(img_stream) returnimg_stream defgen_qrcode_buf(words): qr=qrcode.make(words) buf=io.BytesIO() qr.save(buf,'png') qr_buf=buf.getvalue() #img_stream=base64.b64encode(qr_buf) returnqr_buf
base.html
{%blocktitle%}{%end%} {%blockhead%}{%end%}{%blockh1%}{{data}}{%end%} {%blockcontent%}{%end%}