一. 需求

公司要做一个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 创建本地服务器环境生成二维码相关推荐

  1. unity 传输图片到本地服务器并生成二维码

    #unity 传输图片到本地服务器并生成二维码 电脑安装IIS: link. 在IE地址里输入localhost,能打开,就代表已经安装. ZXing.dll下载(放入unity): link. 服务 ...

  2. liunx+python+django框架实现图片生成二维码

    点击箭头处"蓝色字",免费领测试技术及面试资料! 余生皆欢喜 liunx+python+django框架实现二维码生成器 首先我简单的介绍下django:django官网解释就是如 ...

  3. android将apk生成的二维码放到本地tomcatjenkin(Android 生成二维码)

    如何将apk做成二维码可供下载? 具体步骤 你把apk的链接找到 然后在找到二维码生成器,把链接放就去,生成二维码就可以了!亲试效果很好 怎么找链接,我这边只有文件 搜索二维码生成器 本回答由网友推荐 ...

  4. Python读取Execl文件批量生成二维码

    #参考他人稍微修改 引入包 import qrcode import xlrd 代码 生成二维码 def create_qrcode(file_name, content): img = qrcode ...

  5. python中使用qrcode库生成二维码时,填充logo变成黑白色的解决方法。

    python如何生成qrcode的教程已经有很多了,我这里仅仅排一下坑. import qrcode from PIL import Imageqr = qrcode.QRCode(version=1 ...

  6. python学习 —— 使用QRCode包生成二维码

    我使用的是python3,最简单的方法就是使用QRCode,如果没有安装QRCode package,那么可以使用下面命令进行安装: pip3 install QRCode 然后,测试一下: from ...

  7. python之qrcode模块生成二维码

    用Python的qrcode包来生成二维码很简单 一.前期准备: pip install qrcode qrcode 依赖 Image 这个包: pip install Image 二.安装好之后就可 ...

  8. Python 【生成二维码和条形码】

    一.概述 最近在学习Python , 编写了一个能生成二维码和条形码的窗体.利用窗体上的输入Entrance,可以输入需要编码的原始数据,分别点击按钮可以生成二维码和条形码.分别点击窗体上的按钮,预览 ...

  9. 巧用Python的Qrcode库生成二维码大全

    二维码介绍 QR 码是二维条码的一种,QR来自英文 "Quick Response" 的缩写,即快速反应的意思,源自发明者希望 QR 码可让其内容快速被解码. QR 码 比普通条码 ...

  10. 运用js生成二维码(工作记录)

    工作中需要一个简单的二维码生成功能,此处运用JQuery+jquery.qrcode实现: 需要资源:jquery.js + jquery.qrcode.min.js (网上搜索即可获取) 准备工作 ...

最新文章

  1. tensorflow models 工程解析
  2. 《系统集成项目管理工程师》必背100个知识点-44应急储备和管理储备
  3. Java:重写equals()和hashCode()
  4. Copy ArrayList的四种方式
  5. open ai gpt_让我们来谈谈将GPT-3 AI推文震撼到核心的那条推文
  6. 继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
  7. QT【001】- 基础写在前面的话
  8. PAT1019. 数字黑洞
  9. android关闭应用及获取运营商ISP,判断sim卡属于哪个运营商
  10. 根据文件名 kill 进程
  11. Ruby+watir自动化测试中实现识别验证码图片
  12. linux文件移出目录命令_Linux移动文件命令F01
  13. python可以下载百度文库_用Python爬取百度文库0下载券的免费文档详细步骤,附可执行软件...
  14. 计算机考研2022大纲,2022计算机408考研大纲
  15. Premiere 初识PR
  16. 专业主义——大前研一
  17. 电阻式触摸屏UI设计
  18. SLAE — SecurityTube Linux组装考试
  19. Android p刷机红米4a,红米4A(Redmi 4A 全网通)刷机教程,简单几步搞定刷机
  20. 小智直播配置安装-配置录播,回放

热门文章

  1. 2019年 AI 顶会速递
  2. 材料之kube-dns.yaml
  3. linux centos目录结构(一)
  4. 【Gym-101908 L】Subway Lines【树上两条路径交】
  5. mysql命令行操作语句_MySQL常用命令行操作语句
  6. php 5.3 construct_PHP 构造方法 __construct()(转)
  7. PHP自动加载(下)——PSR4
  8. Docker新手入门基础知识与实战教程
  9. ios安全机制不支持antofocus
  10. java与xml转换 -- XStreamAlias