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