PyQt6内嵌http.server Web 和Flask Web服务器方法详解

PyQt6 可以内嵌一个简单的 Web 服务器。虽然 PyQt6 本身不提供直接的 Web 服务器功能,但可以结合 Python 的标准库(如 http.server)或其他 Web 框架(如 Flask、FastAPI 等)来实现。

示例:使用 http.server内嵌 Web 服务器

以下是一个简单的例子,展示如何在 PyQt6 应用中内嵌一个基本的 Web 服务器:

import sys

from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit

from PyQt6.QtCore import QThread, pyqtSignal

from http.server import BaseHTTPRequestHandler, HTTPServer

 

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):

        self.send_response(200)

        self.send_header('Content-type', 'text/html')

        self.end_headers()

        self.wfile.write(b"Hello from PyQt6 Web Server!")

 

class WebServerThread(QThread):

    def run(self):

        server_address = ('', 8000)

        httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)

        print("Web server running on port 8000...")

        httpd.serve_forever()

 

class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle("PyQt6 Web Server Example")

        self.text_edit = QTextEdit(self)

        self.setCentralWidget(self.text_edit)

        self.text_edit.setText("Web server is running...")

 

        self.webserver_thread = WebServerThread()

        self.webserver_thread.start()

 

if __name__ == "__main__":

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    sys.exit(app.exec())

关键点:

1. SimpleHTTPRequestHandler:这是一个简单的 HTTP 请求处理器,用于处理 GET 请求并返回响应。

2. WebServerThread:这是一个 QThread 子类,用于在后台运行 Web 服务器,避免阻塞主线程。

3. MainWindow:这是 PyQt6 的主窗口,启动时会在后台运行 Web 服务器。

 

运行效果:

- 运行程序后,Web 服务器会在 http://localhost:8000上启动。

- 访问该地址时,会看到 "Hello from PyQt6 Web Server!" 的响应。

- PyQt6 应用的主窗口会显示 "Web server is running..."。

注意事项:

- 这种方法适合简单的场景。如果需要更复杂的功能(如路由、模板渲染等),建议使用 Flask 或 FastAPI 等框架。

Pyqt6内嵌Flask框架完整的示例代码:
from flask import Flask, render_template_string

app = Flask(__name__)

@app.route('/')
def index():
    return render_template_string('''
       

Hello, Flask in PyQt6!


       

This is a Flask application embedded in PyQt6.


    ''')

PyQt6 主程序 (main.py)
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl
import threading
import time
from werkzeug.serving import make_server
from flask_app import app

class FlaskThread(threading.Thread):
    def __init__(self, app):
        threading.Thread.__init__(self)
        self.server = make_server('127.0.0.1', 5000, app)
        self.ctx = app.app_context()
        self.ctx.push()

    def run(self):
        self.server.serve_forever()

    def shutdown(self):
        self.server.shutdown()

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt6 with Flask")
        self.setGeometry(100, 100, 800, 600)
        self.browser = QWebEngineView()
        self.setCentralWidget(self.browser)
        self.start_flask()

    def start_flask(self):
        self.flask_thread = FlaskThread(app)
        self.flask_thread.start()
        time.sleep(1)
        self.browser.setUrl(QUrl("http://127.0.0.1:5000"))

    def closeEvent(self, event):
        self.flask_thread.shutdown()
        event.accept()

if __name__ == '__main__':
    qt_app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(qt_app.exec())
打包命令
pyinstaller --onefile --windowed --add-data "flask_app.py;." main.py

通过以上步骤,你可以将 PyQt6 内嵌 Flask 的应用打包成一个独立的可执行文件,并在没有 Python 环境的电脑上运行。

你可能感兴趣的:(python,pyqt,flask,http)