python-图片流传输的思路及示例(url转换二维码)


Posted in Python onDecember 21, 2020

1.场景

  • 将URL动态生成二维码前端展示(微信支付等,)--》

1.静态文件路径访问
返回URL_name,(a标签,src 静态路由访问)

2.流传输,前端渲染
二进制流返回前端,前端根据二进制流编码类型显示

3.前端js生成
后台获取到微信支付的code_url,前端js将code_url生成二维码,并渲染

  • 实际代码

使用python_web 框架--》tornado
manager.py

import os
import asyncio

import tornado.ioloop
import tornado.httpserver
import tornado.web
import tornado.options

from tornado.options import define, options, parse_command_line
from apps import UrlHandler, Url2Handler, Url3Handler


define("port", default=8000, type=int)


def create_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,
  )
  return application


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

import tornado.web
from manager_handler import gen_qrcode, gen_qrcode_obj,gen_qrcode_buf


class BaseHandler(tornado.web.RequestHandler):
  pass


class UrlHandler(BaseHandler):
  def get(self):
    # 获取链接
    self.render('qrcode.html', title='url', data='URL-提交', img_stream='')

  async def post(self):
    # 生成二维码
    url = self.get_argument('url_str')

    # URL转换二维码
    img_stream = gen_qrcode(url)
    await self.render('qrcode.html', title='qrcode', data='扫码支付', img_stream=img_stream)


class Url2Handler(BaseHandler):
  def get(self):
    # 获取链接
    self.render('qrcode.html', title='url', data='URL-提交', img_stream='')

  async def post(self):
    # 生成二维码
    url = self.get_argument('url_str')

    # URL转换二维码
    img_stream = gen_qrcode_obj(url=url)
    # await self.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)


class Url3Handler(BaseHandelr):
  def get(self):
    self.render('qrcode.html', title='url', data='URL-提交', img_stream='')

  def post(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

import qrcode
import io
import base64
import time


def gen_qrcode(url):
  """
  方式1: URL转换二维码
  :param url: 转换二维码的URL
  :return: base64编码后的 二进制流 二维码数据
  """
  qr = qrcode.make(url)
  buf = io.BytesIO()
  qr.save(buf)
  img_buf = buf.getvalue()
  img_stream = base64.b64encode(img_buf)
  return img_stream


def gen_qrcode_obj(version=1, box_size=10, border=4, url=None):
  """
  方式2: URL转换二维码(图片流传输, template需要指明 data:base64编码)
  :param version:
  :param box_size:
  :param border:
  :return:
  """
  qr = qrcode.QRCode(
    version=version,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=box_size,
    border=border,
  )

  url = "https://www.12dms.com" if url is None else url
  save_name = "./" + "qrcode" + str(time.time()) + ".png"

  qr.add_data(url)
  qr.make()
  img = qr.make_image()
  img.save(save_name.encode())
  with open(save_name, 'rb') as img_f:
    img_stream = img_f.read()
    img_stream = base64.b64encode(img_stream)
    print(img_stream)
  return img_stream

def gen_qrcode_buf(words):
  qr = qrcode.make(words)
  buf = io.BytesIO()
  qr.save(buf, 'png')
  qr_buf = buf.getvalue()
  # img_stream = base64.b64encode(qr_buf)
  return qr_buf

base.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>{% block title %}{% end %}</title>
  {% block head %}{% end %}
</head>

<body>
  <h1 style="text-align: center">
    {% block h1 %}{{ data }}{% end %}
  </h1>
  {% block content %}{% end %}
</body>
</html>

qrcode.html

{% extends "base.html" %}

{% block title %}
  {{ title }}
{% end %}

{% block h1 %}
  {{ data }}
{% end %}


{% block content %}
  <form method="post" action="" >
    <p>
      输入待转换的URL:<input name="url_str"/>
      <br>
{#      {{ img_stream }}#}
      {% if img_stream %}
        <img style="width:180px" src="data:;base64,{{ img_stream }}" alt="">
      {% end %}
    </p>
    <br>
    <input id="submit" type="submit" value="生成二维码">
  </form>
{% end %}

以上就是python-图片流传输的思路及示例(url转换二维码)的详细内容,更多关于python 图片流传输的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
浅析Python中的多重继承
Apr 28 Python
Python判断Abundant Number的方法
Jun 15 Python
5种Python单例模式的实现方式
Jan 14 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
Jul 11 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
Django实现分页显示效果
Oct 31 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 Python
python引入其他文件夹下的py文件具体方法
May 23 Python
python 用pandas实现数据透视表功能
Dec 21 #Python
python 生成正态分布数据,并绘图和解析
Dec 21 #Python
python statsmodel的使用
Dec 21 #Python
Python 实现集合Set的示例
Dec 21 #Python
Python 实现二叉查找树的示例代码
Dec 21 #Python
如何利用Python matplotlib绘制雷达图
Dec 21 #Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 #Python
You might like
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中字符串对齐方法介绍
2015/05/21 Python
使用Python写CUDA程序的方法
2017/03/27 Python
python用户管理系统
2018/03/13 Python
浅析Python函数式编程
2018/10/06 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Python读取实时数据流示例
2019/12/02 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
逻辑链路控制协议
2016/10/01 面试题
2014年母亲节寄语
2014/05/07 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
洗手间标语
2014/06/23 职场文书
小学数学教研活动总结
2014/07/01 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书