当前位置: 代码网 > it编程>编程语言>C/C++ > 详解如何优雅的用PyQt访问http

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

2024年11月30日 C/C++ 我要评论
使用pydantic或dataclaass创建一个数据存储对象第一种# coding: utf-8from typing import anyimport requestsfrom pydantic

使用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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com