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

作者:yblackd 时间:2021-06-18 14:48:44 

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 %}

来源:https://www.cnblogs.com/yblackd/p/13224404.html

标签:python,图片流,传输,url,二维码
0
投稿

猜你喜欢

  • asp Driver和Provider两种连接字符串连接Access时的区别

    2011-03-09 11:19:00
  • python基于TCP实现的文件下载器功能案例

    2021-12-30 05:14:26
  • pytest多重断言的实现

    2021-10-12 03:30:25
  • python 调用API接口 获取和解析 Json数据

    2022-01-24 17:57:15
  • python 可视化库PyG2Plot的使用

    2022-10-14 05:22:17
  • 为ABP框架配置数据库

    2024-01-19 21:52:05
  • 用 Python 制作地球仪的方法

    2022-11-10 19:10:36
  • 在vue-cli3中使用axios获取本地json操作

    2023-07-02 17:07:12
  • Python编程中的异常处理教程

    2022-10-16 04:26:23
  • php上传大文件设置方法

    2023-11-21 19:11:22
  • 基于javascript的Form表单验证

    2024-04-10 16:20:03
  • 用FrongPage设计网页花样

    2008-09-17 10:47:00
  • Python enumerate函数功能与用法示例

    2023-11-06 08:44:07
  • python统计文本字符串里单词出现频率的方法

    2021-11-10 17:38:48
  • Python实现简单图像缩放与旋转

    2022-02-19 05:48:17
  • python 常用的基础函数

    2023-07-24 11:10:51
  • Python中常见的反爬机制及其破解方法总结

    2023-03-05 19:38:42
  • Python面向对象编程基础解析(一)

    2021-08-10 15:05:12
  • Python入门教程5. 字典基本操作【定义、运算、常用函数】 <font color=red>原创</font>

    2021-04-29 19:08:04
  • SQL中exists的使用方法

    2011-12-01 08:36:07
  • asp之家 网络编程 m.aspxhome.com