最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何優(yōu)雅的用PyQt訪(fǎng)問(wèn)http

 更新時(shí)間:2024年11月29日 09:20:58   作者:赤鳶QAQ  
這篇文章主要我打開(kāi)詳細(xì)介紹了如何優(yōu)雅的用PyQt實(shí)現(xiàn)訪(fǎng)問(wèn)http,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下

使用pydantic或dataclaass創(chuàng)建一個(gè)數(shù)據(jù)存儲(chǔ)對(duì)象

第一種

# coding: utf-8
from typing import Any

import requests
from pydantic import Field, BaseModel


class ResponseModel(BaseModel):
    status: bool = Field(True, description="響應(yīng)狀態(tài)")
    message: str = Field('請(qǐng)求成功', description="響應(yīng)信息")
    error: str = Field('', description="錯(cuò)誤信息")
    response: requests.Response = Field(None, description="響應(yīng)對(duì)象")
    result: Any = Field({}, description="響應(yīng)數(shù)據(jù)")

    class Config:
        arbitrary_types_allowed = True

線(xiàn)程

# 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='請(qǐng)求失敗',
                    error=e,
                )
            )

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

使用函數(shù)將請(qǐng)求對(duì)象加入至線(xiàn)程中

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: 當(dāng)請(qǐng)求正確時(shí)處理邏輯
        print(response_model.result)
        pass
    else:
        # TODO: 當(dāng)請(qǐng)求錯(cuò)誤時(shí)處理邏輯
        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='請(qǐng)求方法,如 GET、POST、PUT、DELETE')
    url: str = Field(..., description='請(qǐng)求的 URL 地址')
    params: dict = Field(None, description='請(qǐng)求參數(shù),如 GET 請(qǐng)求時(shí)附帶的參數(shù)')
    data: dict = Field(None, description='請(qǐng)求數(shù)據(jù),如 POST 請(qǐng)求時(shí)提交的數(shù)據(jù)')
    json_: dict = Field(None, description='請(qǐng)求數(shù)據(jù),如 POST 請(qǐng)求時(shí)提交的 json 數(shù)據(jù)', alias='json')
    headers: dict = Field(None, description='請(qǐng)求頭,如 Content-Type、User-Agent 等')
    cookies: dict = Field(None, description='請(qǐng)求 cookies,如登錄后獲取的 cookie')
    files: dict = Field(None, description='上傳的文件,如 POST 請(qǐng)求時(shí)上傳的文件')
    auth: Union[tuple, list] = Field(None, description='HTTP 認(rèn)證,如 Basic 認(rèn)證')
    timeout: int = Field(None, description='請(qǐng)求超時(shí)時(shí)間,單位為秒')
    allow_redirects: bool = Field(True, description='是否允許重定向')
    proxies: dict = Field(None, description='代理設(shè)置')
    hooks: Any = Field(None, description='鉤子函數(shù)')
    stream: bool = Field(False, description='是否以流的形式響應(yīng)')
    verify: bool = Field(False, description='是否驗(yàn)證 SSL 證書(shū)')
    cert: Union[str, tuple] = Field(None, description='客戶(hù)端 SSL 證書(shū)')

    class Config:
        arbitrary_types_allowed = True

class ResponseModel(BaseModel):
    status: bool = Field(True, description="響應(yīng)狀態(tài)")
    message: str = Field('請(qǐng)求成功', description="響應(yīng)信息")
    error: str = Field('', description="錯(cuò)誤信息")
    response: requests.Response = Field(None, description="響應(yīng)對(duì)象")
    result: Any = Field({}, description="響應(yīng)數(shù)據(jù)")

    class Config:
        arbitrary_types_allowed = True

請(qǐng)求

# 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='請(qǐng)求失敗',error=str(e)))

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

運(yùn)用

from PyQt5.QtWidgets import QApplication

from common import RequestThread, RequestModel, ResponseModel


def response_handler(response_model: ResponseModel):
    if response_model.status:
        # TODO: 當(dāng)請(qǐng)求正確時(shí)處理邏輯
        print(response_model.response.text)
        pass
    else:
        # TODO: 當(dāng)請(qǐng)求錯(cuò)誤時(shí)處理邏輯
        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_()

到此這篇關(guān)于詳解如何優(yōu)雅的用PyQt訪(fǎng)問(wèn)http的文章就介紹到這了,更多相關(guān)PyQt訪(fǎng)問(wèn)http內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python解決pandas處理缺失值為空字符串的問(wèn)題

    python解決pandas處理缺失值為空字符串的問(wèn)題

    下面小編就為大家分享一篇python解決pandas處理缺失值為空字符串的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python中用matplotlib畫(huà)圖遇到的一些問(wèn)題及解決

    python中用matplotlib畫(huà)圖遇到的一些問(wèn)題及解決

    這篇文章主要介紹了python中用matplotlib畫(huà)圖遇到的一些問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解Python命令行解析工具Argparse

    詳解Python命令行解析工具Argparse

    這篇文章主要為大家詳細(xì)介紹了Python命令行解析工具Argparse的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 講解Python中if語(yǔ)句的嵌套用法

    講解Python中if語(yǔ)句的嵌套用法

    這篇文章主要介紹了講解Python中if語(yǔ)句的嵌套用法,是Python入門(mén)當(dāng)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python使用signal定時(shí)結(jié)束AsyncIOScheduler任務(wù)的問(wèn)題

    Python使用signal定時(shí)結(jié)束AsyncIOScheduler任務(wù)的問(wèn)題

    這篇文章主要介紹了Python使用signal定時(shí)結(jié)束AsyncIOScheduler任務(wù),在使用aiohttp結(jié)合apscheduler的AsyncIOScheduler模擬定點(diǎn)并發(fā)的時(shí)候遇到兩個(gè)問(wèn)題,針對(duì)每個(gè)問(wèn)題給大家詳細(xì)介紹,需要的朋友可以參考下
    2021-07-07
  • 全景解析Python中可變對(duì)象與不可變對(duì)象的核心區(qū)別和實(shí)際應(yīng)用

    全景解析Python中可變對(duì)象與不可變對(duì)象的核心區(qū)別和實(shí)際應(yīng)用

    本文將重點(diǎn)剖析Python所有進(jìn)階開(kāi)發(fā)者都無(wú)法繞開(kāi)的核心命題,即可變對(duì)象(Mutable)與不可變對(duì)象(Immutable)的底層差異,并結(jié)合真實(shí)的架構(gòu)場(chǎng)景探討如何在實(shí)戰(zhàn)中做出最優(yōu)抉擇
    2026-03-03
  • python在控制臺(tái)輸出進(jìn)度條的方法

    python在控制臺(tái)輸出進(jìn)度條的方法

    這篇文章主要介紹了python在控制臺(tái)輸出進(jìn)度條的方法,實(shí)例分析了Python輸出進(jìn)度條效果的方法,需要的朋友可以參考下
    2015-06-06
  • Python處理重復(fù)字符

    Python處理重復(fù)字符

    在文本處理的時(shí)候,我們時(shí)常會(huì)遇到需要處理重復(fù)字樣的情況,Python提供了很多方法來(lái)處理這種情況,下面就來(lái)詳細(xì)的介紹幾種方法,感興趣的可以了解一下
    2024-02-02
  • python利用WordCloud模塊實(shí)現(xiàn)詞云繪制

    python利用WordCloud模塊實(shí)現(xiàn)詞云繪制

    wordcloud是詞云繪圖模塊,封裝了WordCloud詞云類(lèi),是詞云的基本載體,下面小編就來(lái)和大家詳細(xì)講講如何利用WordCloud模塊實(shí)現(xiàn)詞云繪制吧,希望對(duì)大家有所幫助
    2023-10-10
  • Python目錄和文件處理總結(jié)詳解

    Python目錄和文件處理總結(jié)詳解

    這篇文章主要介紹了Python目錄和文件處理總結(jié)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

阜平县| 富阳市| 都江堰市| 塔城市| 琼海市| 盘山县| 布尔津县| 湟中县| 资兴市| 武强县| 镇安县| 梅州市| 元江| 三门峡市| 历史| 原平市| 邵东县| 迁西县| 天柱县| 冀州市| 嘉定区| 正阳县| 五指山市| 浪卡子县| 门头沟区| 龙游县| 安阳市| 翁源县| 荔波县| 边坝县| 平凉市| 平顶山市| 剑川县| 中卫市| 平安县| 南郑县| 腾冲县| 富平县| 东莞市| 南通市| 慈利县|