python-图片流传输(url转换二维码)

1.场景

  • 将URL动态生成二维码前端展示(微信支付等,)--》
  1. 静态文件路径访问
    返回URL_name,(a标签,src 静态路由访问)
  2. 流传输,前端渲染
    二进制流返回前端,前端根据二进制流编码类型显示
  3. 前端js生成
    后台获取到微信支付的code_url,前端js将code_url生成二维码,并渲染
  • 实际代码
    使用python_web 框架--》tornado
  1. 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


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),
        ],
        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()
  1. apps.py
import tornado.web
from manager_handler import gen_qrcode, gen_qrcode_obj


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)
  1. 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
  1. 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>
  1. 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 %}

猜你喜欢

转载自blog.csdn.net/weixin_44070137/article/details/107097403