详解如何优雅的用PyQt访问http

 更新时间:2024年11月29日 09:20:58   作者:赤鸢QAQ  
这篇文章主要我打开详细介绍了如何优雅的用PyQt实现访问http,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下

使用pydantic或dataclaass创建一个数据存储对象

第一种

# coding: utf-8
from typing import Any

import requests
from pydantic import Field, BaseModel


class ResponseModel(BaseModel):
    status: bool = Field(True, description="响应状态")
    message: str = Field('请求成功', description="响应信息")
    error: str = Field('', description="错误信息")
    response: requests.Response = Field(None, description="响应对象")
    result: Any = Field({}, description="响应数据")

    class Config:
        arbitrary_types_allowed = True

线程

# coding: utf-8
from PySide6.QtCore import QThread, Signal, Slot

from common.models import ResponseModel
from loguru import logger


class RequestThread(QThread):
    modelChanged = Signal(ResponseModel)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.request = None

    def run(self):
        if not self.request:
            return
        try:
            result = self.request()
            self.modelChanged.emit(
                ResponseModel(
                    result=result,
                )
            )
        except Exception as e:
            logger.error(e)
            self.modelChanged.emit(
                ResponseModel(
                    status=False,
                    message='请求失败',
                    error=e,
                )
            )

    def setRequest(self, request):
        self.request = request
        if not self.isRunning():
            self.start()

使用函数将请求对象加入至线程中

import requests
from PySide6.QtCore import QCoreApplication

from common.models import ResponseModel
from request_thread import RequestThread


def baidu_request():
    response = requests.get('http://www.baidu.com')
    response.encoding = 'utf-8'
    return response.text


def response_handler(response_model: ResponseModel):
    if response_model.status:
        # TODO: 当请求正确时处理逻辑
        print(response_model.result)
        pass
    else:
        # TODO: 当请求错误时处理逻辑
        print(response_model.message, response_model.error)


if __name__ == '__main__':
    app = QCoreApplication([])
    thread = RequestThread()
    thread.modelChanged.connect(response_handler)
    thread.finished.connect(app.quit)
    thread.setRequest(baidu_request)
    app.exec()

第二种

model模型

# coding: utf-8
from typing import Union, Any

from pydantic import BaseModel, Field


class RequestModel(BaseModel):
    method: str = Field('GET', description='请求方法,如 GET、POST、PUT、DELETE')
    url: str = Field(..., description='请求的 URL 地址')
    params: dict = Field(None, description='请求参数,如 GET 请求时附带的参数')
    data: dict = Field(None, description='请求数据,如 POST 请求时提交的数据')
    json_: dict = Field(None, description='请求数据,如 POST 请求时提交的 json 数据', alias='json')
    headers: dict = Field(None, description='请求头,如 Content-Type、User-Agent 等')
    cookies: dict = Field(None, description='请求 cookies,如登录后获取的 cookie')
    files: dict = Field(None, description='上传的文件,如 POST 请求时上传的文件')
    auth: Union[tuple, list] = Field(None, description='HTTP 认证,如 Basic 认证')
    timeout: int = Field(None, description='请求超时时间,单位为秒')
    allow_redirects: bool = Field(True, description='是否允许重定向')
    proxies: dict = Field(None, description='代理设置')
    hooks: Any = Field(None, description='钩子函数')
    stream: bool = Field(False, description='是否以流的形式响应')
    verify: bool = Field(False, description='是否验证 SSL 证书')
    cert: Union[str, tuple] = Field(None, description='客户端 SSL 证书')

    class Config:
        arbitrary_types_allowed = True

class ResponseModel(BaseModel):
    status: bool = Field(True, description="响应状态")
    message: str = Field('请求成功', description="响应信息")
    error: str = Field('', description="错误信息")
    response: requests.Response = Field(None, description="响应对象")
    result: Any = Field({}, description="响应数据")

    class Config:
        arbitrary_types_allowed = True

请求

# coding: utf-8
import requests
from PyQt5.QtCore import pyqtSignal
from pydantic import BaseModel
from queue import Queue
from ..models import ResponseModel, RequestModel

requests.packages.urllib3.disable_warnings()


class RequestThread(QThread):
    responseChanged = pyqtSignal(BaseModel)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.queue = Queue()

    def run(self):
        while not self.queue.empty():
            method = self.queue.get()  # type: RequestModel

            try:
                data = method.model_dump(mode='python')
                data['json'] = data.pop('json_', None)
                response = requests.request(**data)
                response.raise_for_status()
                self.responseChanged.emit(ResponseModel(response=response))
            except requests.exceptions.RequestException as e:
                self.responseChanged.emit(ResponseModel(status=False, message='请求失败',error=str(e)))

    def setRequest(self, method: RequestModel):
        self.queue.put(method)
        if not self.isRunning():
            self.start()

运用

from PyQt5.QtWidgets import QApplication

from common import RequestThread, RequestModel, ResponseModel


def response_handler(response_model: ResponseModel):
    if response_model.status:
        # TODO: 当请求正确时处理逻辑
        print(response_model.response.text)
        pass
    else:
        # TODO: 当请求错误时处理逻辑
        print(response_model.message, response_model.error)


# Create a QApplication instance
app = QApplication([])

# Create a request thread and start it
request_thread = RequestThread()
request_thread.responseChanged.connect(response_handler)
request_thread.setRequest(RequestModel(url='http://www.baidu.com'))
request_thread.finished.connect(app.quit)
app.exec_()

到此这篇关于详解如何优雅的用PyQt访问http的文章就介绍到这了,更多相关PyQt访问http内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python进程间通信 multiProcessing Queue队列实现详解

    Python进程间通信 multiProcessing Queue队列实现详解

    这篇文章主要介绍了python进程间通信 mulitiProcessing Queue队列实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • python自动化测试中APScheduler Flask的应用示例

    python自动化测试中APScheduler Flask的应用示例

    这篇文章主要为大家介绍了python自动化测试中APScheduler Flask的应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Python实现号码归属地查询功能

    Python实现号码归属地查询功能

    这篇文章主要为大家详细介绍了如何利用Python实现对手机号码进行地域分析并查询归属地的功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • 对web.py设置favicon.ico的方法详解

    对web.py设置favicon.ico的方法详解

    今天小编就为大家分享一篇对web.py设置favicon.ico的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 对Python 获取类的成员变量及临时变量的方法详解

    对Python 获取类的成员变量及临时变量的方法详解

    今天小编就为大家分享一篇对Python 获取类的成员变量及临时变量的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python设计模式之抽象工厂模式原理与用法详解

    Python设计模式之抽象工厂模式原理与用法详解

    这篇文章主要介绍了Python设计模式之抽象工厂模式,简单讲述了抽象工厂模式的概念、原理并结合实例形式分析了Python实现与使用抽象工厂模式的相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • Python数据清洗&预处理入门教程

    Python数据清洗&预处理入门教程

    凡事预则立,不预则废,训练机器学习模型也是如此。数据清洗和预处理是模型训练之前的必要过程,否则模型可能就废了。本文是一个初学者指南,将带你领略如何在任意的数据集上,针对任意一个机器学习模型,完成数据预处理工作
    2022-10-10
  • 关于Pytorch MaxUnpool2d中size操作方式

    关于Pytorch MaxUnpool2d中size操作方式

    今天小编就为大家分享一篇关于Pytorch MaxUnpool2d中size操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 如何利用Python 进行边缘检测

    如何利用Python 进行边缘检测

    本文主要介绍了关于边缘检测的知识,包括边缘检测的理论以及如何使用 Python 实现边缘检测,希望对您的学习有所帮助。
    2020-10-10
  • python爬虫获取京东手机图片的图文教程

    python爬虫获取京东手机图片的图文教程

    下面小编就为大家分享一篇python爬虫获取京东手机图片的图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论