Python 创建本地服务器环境生成二维码
一. 需求
公司要做一个H5手机端适配页面,因技术问题所以H5是外包的,每次前端给我们源码,我们把源码传到服务器让其他人访问看是否存在bug,这个不是很麻烦吗?有人说,可以让前端在他们的服务器上先托管,等我们验收了后在给源码不结了嘛,是的呀!所有的人都愿意这样,but……
要是能在本地搭建环境直接访问是不是更好的。问题是我们这边程序此刻没时间与H5前端对接,既浪费我们时间又浪费他们时间。所以开发一个service服务器让测试人员直接参与,这样就可以把我们完美分工了。
二.Python搭建web服务器
Python自带一个http.serrver包可以简单的搭建web服务器
官网:https://docs.python.org/3/library/http.server.html?highlight=httpserver#http.server.BaseHTTPRequestHandler
参考:
http://www.cnblogs.com/xuxn/archive/2011/02/14/build-simple-web-server-with-python.html
http://blog.csdn.net/kevin_darkelf/article/details/40979545
http://blog.csdn.net/tianmohust/article/details/7689414
# return Html page class MyHttpBaseHandler(BaseHTTPRequestHandler):def do_GET(self):print(self.path)enc = "UTF-8"encoded = ''.join(self.path).encode(enc)f = io.BytesIO()f.write(encoded)f.seek(0)self.send_response(200)self.send_header("Content-type", "text/html; charset=%s" % enc)self.send_header("Content-Length", str(len(encoded)))self.end_headers()shutil.copyfileobj(f, self.wfile)# This method serves the 'POST' request type, only allowed for CGI scripts.def do_POST(self):pass# return static -m eg:python -m http.server 8080 class MyHttpSimpleHandler(SimpleHTTPRequestHandler):pass
httpd = HTTPServer((self.addressIP, self.port), MyHttpSimpleHandler)print("Server started on " + self.addressIP + ",port " + str(self.port) + ".....")httpd.serve_forever()
三. 绘制UI,生成二维码
之前写过
Pyqt+QRcode 生成 识别 二维码
直接参考生成二维码
绘制UI
class MainWidgetUI(QDialog):def __init__(self, parent=None):super(MainWidgetUI, self).__init__(parent)self.setFixedSize(640, 480) # PyQT禁止调整窗口大小self.setWindowTitle('Python 创建本地服务器环境生成二维码')self.setWindowIcon(QtGui.QIcon("favicon.ico"))# Main布局main_layout = QVBoxLayout()self.methodtype = QComboBox()self.methodTopLayout = QHBoxLayout()self.methodtype.addItem('文件', QVariant(1)) # 使用 QVariant保存Keyself.methodtype.addItem('地址', QVariant(2))self.methodtype.setFixedWidth(90) # 设置固定不变的宽度为90pxself.pushButton = QPushButton("选择文件")self.Url = QLineEdit()self.Url.hide()self.methodTopLayout.addWidget(self.methodtype) # 添加一个挂件self.methodTopLayout.addWidget(self.Url) # 添加一个挂件self.methodTopLayout.addSpacing(10) # 添加一个10px的空间距离 且不带弹性 self.methodTopLayout.addWidget(self.pushButton)self.qrcodeGroup = QVBoxLayout()self.groupBox = QGroupBox("二维码")self.QrLabel = QLabel(self.groupBox)self.qrcodeGroup.addWidget(self.groupBox)main_layout.addLayout(self.methodTopLayout) # 添加一个布局 main_layout.addLayout(self.qrcodeGroup)self.setLayout(main_layout)self.QrLabel.setGeometry(QRect(30, 30, 540, 380)) # 设置qrLabel 的图形位置# self.QrLabel.setScaledContents(True) # 按比例缩放二维码显示内容 self.pushButton.clicked.connect(self.FileOperator) # 点击按钮self.methodtype.currentIndexChanged.connect(self.comboxchange) # 下拉框改变时候事件self.Url.textChanged.connect(self.comboxchange) # 当地址文本框内容改变时触发
生成二维码
# 获取服务器(地址) 生成二维码def ShowQrCode(self, strings):if not strings: # 参数为空,pixmap为空self.QrLabel.setPixmap(QtGui.QPixmap(""))else:qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=2, )qr.add_data(strings)qr.make(fit=True)img = qr.make_image()qraddr=tempDir+'qr.png'print(qraddr)img.save(qraddr)
很简单,通过选择文件获取路径,将文件copy到当前目录,将当前目录设置为http.server服务目录,二维码则为服务地址+文件名
四.注意的事项
1. 获取当前局域网IP
addressIP = socket.gethostbyname_ex(socket.gethostname())[-1][0] # 获取局域网IP
2.获取windows临时目录
tempDir = tempfile.gettempdir() + '/' # 获取临时temp目录
3. copy文件
copy文件有两种,一种为Python自带,另一种为Pyqt中方法
shutil.copy(filePath, "./") # 文件=>目录
QFile.copy(filePath, sys.path[0]+"\\"+file) # QFile.copy 必须文件对=>文件
4. 使用线程开启服务
直接在UI中开启httpd.serve_forever() 会导致UI堵塞,所以使用QtCore.QThread 线程开启http服务
5.动态调整UI大小
参数不同导致生成的二维码大小不同,所以要动态修改UI大小以便将整个二维码显示全
qrsize = Image.open(qraddr).sizeif qrsize[0] > 400: # 二维码的像素值大于400的时候动态修改窗体的大小dsize = qrsize[0] // 2 # 取整数部分self.setFixedSize(640 + dsize, 480 + dsize)self.QrLabel.setGeometry(QRect(30, 30, 540 + dsize, 380 + dsize))else:self.setFixedSize(640, 480)self.QrLabel.setGeometry(QRect(30, 30, 540, 380))self.QrLabel.setPixmap(QtGui.QPixmap(qraddr))
6. 通过判断文件的md5对比文件是否为最新版文件
if filePath:file = filePath.split('/')[-1]isfExist = os.path.exists(file)if not isfExist: # 不存在文件shutil.copy(filePath, "./") # 文件对=>目录else: # 已经存在文件,对比文件md5 判断是否为最新文件md5FilePath = self.getFileMD5(filePath)md5File = self.getFileMD5(file)if md5File != md5FilePath:shutil.copy(filePath, "./")# 获取文件的MD5值,适用于小文件def getFileMD5(self, filepath):f = open(filepath, 'rb')md5obj = hashlib.md5()md5obj.update(f.read())hash = md5obj.hexdigest()f.close()return str(hash).upper()
7.生成debug.log 日志
def delog(string='--'):debugFile=open("debog.txt",'a',1,'utf-8')debugFile.writelines(string+'\n')debugFile.close()
五.完整代码
# -*- coding: UTF8 -*- import io, shutil, sys, os from http.server import HTTPServer, BaseHTTPRequestHandler, SimpleHTTPRequestHandler from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5 import QtGui import qrcode from PIL import Image import socket import hashlib import tempfileport = 8080 # 默认端口 addressIP = socket.gethostbyname_ex(socket.gethostname())[-1][0] # 获取局域网IP tempDir = tempfile.gettempdir() + '/' # 获取临时temp目录class MainWidgetUI(QDialog):def __init__(self, parent=None):super(MainWidgetUI, self).__init__(parent)self.setFixedSize(640, 480) # PyQT禁止调整窗口大小self.setWindowTitle('Python 创建本地服务器环境生成二维码')self.setWindowIcon(QtGui.QIcon("favicon.ico"))# Main布局main_layout = QVBoxLayout()self.methodtype = QComboBox()self.methodTopLayout = QHBoxLayout()self.methodtype.addItem('文件', QVariant(1)) # 使用 QVariant保存Keyself.methodtype.addItem('地址', QVariant(2))self.methodtype.setFixedWidth(90) # 设置固定不变的宽度为90pxself.pushButton = QPushButton("选择文件")self.Url = QLineEdit()self.Url.hide()self.methodTopLayout.addWidget(self.methodtype) # 添加一个挂件self.methodTopLayout.addWidget(self.Url) # 添加一个挂件self.methodTopLayout.addSpacing(10) # 添加一个10px的空间距离 且不带弹性 self.methodTopLayout.addWidget(self.pushButton)self.qrcodeGroup = QVBoxLayout()self.groupBox = QGroupBox("二维码")self.QrLabel = QLabel(self.groupBox)self.qrcodeGroup.addWidget(self.groupBox)main_layout.addLayout(self.methodTopLayout) # 添加一个布局 main_layout.addLayout(self.qrcodeGroup)self.setLayout(main_layout)self.QrLabel.setGeometry(QRect(30, 30, 540, 380)) # 设置qrLabel 的图形位置# self.QrLabel.setScaledContents(True) # 按比例缩放二维码显示内容 self.pushButton.clicked.connect(self.FileOperator) # 点击按钮self.methodtype.currentIndexChanged.connect(self.comboxchange) # 下拉框改变时候事件self.Url.textChanged.connect(self.comboxchange) # 当地址文本框内容改变时触发# 文件操作def FileOperator(self):filePath = self.selectFile()if filePath:file = filePath.split('/')[-1]isfExist = os.path.exists(file)if not isfExist: # 不存在文件shutil.copy(filePath, "./") # 文件对=>目录# delog(a) # 打包exe调试日志log# QFile.copy(filePath, sys.path[0]+"\\"+file) QFile.copy 必须文件对=>文件else: # 已经存在文件,对比文件md5 判断是否为最新文件md5FilePath = self.getFileMD5(filePath)md5File = self.getFileMD5(file)if md5File != md5FilePath:shutil.copy(filePath, "./")# 拼接二维码参数address = "http://" + addressIP + ':' + str(port) + '/' + fileself.ShowQrCode(address) # 显示二维码print('生成qrcord')self.Theading = TheadingPost((addressIP, port)) # 开进程打开服务-直接启动http.service 会导致UI进程无响应self.Theading.start() # 线程开始# 获取文件的MD5值,适用于小文件def getFileMD5(self, filepath):f = open(filepath, 'rb')md5obj = hashlib.md5()md5obj.update(f.read())hash = md5obj.hexdigest()f.close()return str(hash).upper()# 选择文件def selectFile(self):# getOpenFileName 只能选择一个 getOpenFileNames 可多个选择files = QFileDialog.getOpenFileName(self, "请选择播放文件", '', "*.*")if files[0] == '':QMessageBox.warning(self, u'错误提示!', "请选择文件", QMessageBox.Yes)else:return files[0]# 下拉框选择def comboxchange(self):currentIndex = self.methodtype.currentIndex() # currentIndex 索引是从0开始自增key = self.methodtype.itemData(currentIndex) # QVariant 保存的 key# self.methodtype.currentText() # 文本if key == 1: # 文件 self.pushButton.show()self.Url.hide()self.ShowQrCode("")elif key == 2: # 地址 self.pushButton.hide()self.Url.show()url = self.Url.text()self.ShowQrCode(url)# 获取服务器(地址) 生成二维码12def ShowQrCode(self, strings):if not strings: # 参数为空,pixmap为空self.QrLabel.setPixmap(QtGui.QPixmap(""))else:qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=2, )qr.add_data(strings)qr.make(fit=True)img = qr.make_image()qraddr=tempDir+'qr.png'print(qraddr)img.save(qraddr)qrsize = Image.open(qraddr).sizeif qrsize[0] > 400: # 二维码的像素值大于400的时候动态修改窗体的大小dsize = qrsize[0] // 2 # 取整数部分self.setFixedSize(640 + dsize, 480 + dsize)self.QrLabel.setGeometry(QRect(30, 30, 540 + dsize, 380 + dsize))else:self.setFixedSize(640, 480)self.QrLabel.setGeometry(QRect(30, 30, 540, 380))self.QrLabel.setPixmap(QtGui.QPixmap(qraddr))# return Html page class MyHttpBaseHandler(BaseHTTPRequestHandler):def do_GET(self):print(self.path)enc = "UTF-8"encoded = ''.join(self.path).encode(enc)f = io.BytesIO()f.write(encoded)f.seek(0)self.send_response(200)self.send_header("Content-type", "text/html; charset=%s" % enc)self.send_header("Content-Length", str(len(encoded)))self.end_headers()shutil.copyfileobj(f, self.wfile)# This method serves the 'POST' request type, only allowed for CGI scripts.def do_POST(self):pass# return static -m eg:python -m http.server 8080 class MyHttpSimpleHandler(SimpleHTTPRequestHandler):pass# 启动服务 class TheadingPost(QThread):def __init__(self, list):super(TheadingPost, self).__init__()self.addressIP = list[0]self.port = list[1]def run(self):httpd = HTTPServer((self.addressIP, self.port), MyHttpSimpleHandler)print("Server started on " + self.addressIP + ",port " + str(self.port) + ".....")httpd.serve_forever()def delog(string='--'):debugFile=open("debog.txt",'a',1,'utf-8')debugFile.writelines(string+'\n')debugFile.close()if __name__ == "__main__":app = QApplication(sys.argv)main_widget = MainWidgetUI()main_widget.show()sys.exit(app.exec_())
六.运行效果
Python 创建本地服务器环境生成二维码相关推荐
- unity 传输图片到本地服务器并生成二维码
#unity 传输图片到本地服务器并生成二维码 电脑安装IIS: link. 在IE地址里输入localhost,能打开,就代表已经安装. ZXing.dll下载(放入unity): link. 服务 ...
- liunx+python+django框架实现图片生成二维码
点击箭头处"蓝色字",免费领测试技术及面试资料! 余生皆欢喜 liunx+python+django框架实现二维码生成器 首先我简单的介绍下django:django官网解释就是如 ...
- android将apk生成的二维码放到本地tomcatjenkin(Android 生成二维码)
如何将apk做成二维码可供下载? 具体步骤 你把apk的链接找到 然后在找到二维码生成器,把链接放就去,生成二维码就可以了!亲试效果很好 怎么找链接,我这边只有文件 搜索二维码生成器 本回答由网友推荐 ...
- Python读取Execl文件批量生成二维码
#参考他人稍微修改 引入包 import qrcode import xlrd 代码 生成二维码 def create_qrcode(file_name, content): img = qrcode ...
- python中使用qrcode库生成二维码时,填充logo变成黑白色的解决方法。
python如何生成qrcode的教程已经有很多了,我这里仅仅排一下坑. import qrcode from PIL import Imageqr = qrcode.QRCode(version=1 ...
- python学习 —— 使用QRCode包生成二维码
我使用的是python3,最简单的方法就是使用QRCode,如果没有安装QRCode package,那么可以使用下面命令进行安装: pip3 install QRCode 然后,测试一下: from ...
- python之qrcode模块生成二维码
用Python的qrcode包来生成二维码很简单 一.前期准备: pip install qrcode qrcode 依赖 Image 这个包: pip install Image 二.安装好之后就可 ...
- Python 【生成二维码和条形码】
一.概述 最近在学习Python , 编写了一个能生成二维码和条形码的窗体.利用窗体上的输入Entrance,可以输入需要编码的原始数据,分别点击按钮可以生成二维码和条形码.分别点击窗体上的按钮,预览 ...
- 巧用Python的Qrcode库生成二维码大全
二维码介绍 QR 码是二维条码的一种,QR来自英文 "Quick Response" 的缩写,即快速反应的意思,源自发明者希望 QR 码可让其内容快速被解码. QR 码 比普通条码 ...
- 运用js生成二维码(工作记录)
工作中需要一个简单的二维码生成功能,此处运用JQuery+jquery.qrcode实现: 需要资源:jquery.js + jquery.qrcode.min.js (网上搜索即可获取) 准备工作 ...
最新文章
- tensorflow models 工程解析
- 《系统集成项目管理工程师》必背100个知识点-44应急储备和管理储备
- Java:重写equals()和hashCode()
- Copy ArrayList的四种方式
- open ai gpt_让我们来谈谈将GPT-3 AI推文震撼到核心的那条推文
- 继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
- QT【001】- 基础写在前面的话
- PAT1019. 数字黑洞
- android关闭应用及获取运营商ISP,判断sim卡属于哪个运营商
- 根据文件名 kill 进程
- Ruby+watir自动化测试中实现识别验证码图片
- linux文件移出目录命令_Linux移动文件命令F01
- python可以下载百度文库_用Python爬取百度文库0下载券的免费文档详细步骤,附可执行软件...
- 计算机考研2022大纲,2022计算机408考研大纲
- Premiere 初识PR
- 专业主义——大前研一
- 电阻式触摸屏UI设计
- SLAE — SecurityTube Linux组装考试
- Android p刷机红米4a,红米4A(Redmi 4A 全网通)刷机教程,简单几步搞定刷机
- 小智直播配置安装-配置录播,回放
热门文章
- 2019年 AI 顶会速递
- 材料之kube-dns.yaml
- linux centos目录结构(一)
- 【Gym-101908 L】Subway Lines【树上两条路径交】
- mysql命令行操作语句_MySQL常用命令行操作语句
- php 5.3 construct_PHP 构造方法 __construct()(转)
- PHP自动加载(下)——PSR4
- Docker新手入门基础知识与实战教程
- ios安全机制不支持antofocus
- java与xml转换 -- XStreamAlias