最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
PyQt中使用QtNetwork实现异步HTTP请求例子
时间:2015-01-02 编辑:简简单单 来源:一聚教程网
引子
最近有需求要在 PyQt 中请求一个链接, 因为比较简单直接用 urllib2 处理了, 但是 urllib2 在 有延时的时候会造成 GUI 界面卡死. 所以今天研究研究 QtNetwork 模块.
QtNetwork 中的请求在 PyQt 中都是异步的.
简单的请求 QHttp
发起一个GET请求
PyQt4.QtNetwork.QHttp 可以发起一个简单请求, 需要注意的是这个对象需要通过调用 setHost 设置请求主机, 然后 调用 get/post 传入 path 才能正常使用.
代码如下 | 复制代码 |
#!/usr/bin/env python
def __init__(self, parent=None): self.http = QtNetwork.QHttp(parent=self) # 绑定 done 信号 self.url = QtCore.QUrl("http://linuxzen.com/") # 设置主机 def on_req_done(self, error):
|
保存文件
如果想要下载文件, 可以给 get 方法传一个 QtCore.QFile 对象, 会将请求内容保存 到文件
代码如下 | 复制代码 |
#!/usr/bin/env python from PyQt4 import QtGui, QtCore, QtNetwork
def __init__(self, parent=None): self.http = QtNetwork.QHttp(parent=self) self.url = QtCore.QUrl("http://www.linuxzen.com/") def on_req_done(self, error):
|
上面代码将请求下来的内容保存到当前目录的 test 文件里.
处理头部信息
现在有一个需求就是有一个链接会返回一个 301 或 302 的跳转, 但是 PyQt4.QtNetwork.QHttp 没有实现自动跳转, 需要我们自动判断头信息进行跳转.
我们可以绑定PyQt4.QtNetwork.QHttp.responseHeaderReceived的信号来处理头部信息, 这个信号将给槽传递一个 PyQt4.QtNetwork.QHttpResponseHeader 的实例.
通过判断状态吗, 并抓取 Location 头实现跳转
代码如下 | 复制代码 |
#!/usr/bin/env python
def __init__(self, parent=None): self.http = QtNetwork.QHttp(parent=self) self.url = QtCore.QUrl("http://t.cn/zTocACq") def on_response_header(self, response_header): def on_req_done(self, error):
|
运行上面代码, 你将看到下面输出
Redirect to: http://www.111com.net
Success
处理参数
如果你的 GET 请求的 url 是带着参数传给 QUrl 的, 那么 QUrl.path() 将不会返回带参数的 路径需要自己处理. 可以参见下面的处理函数
代码如下 | 复制代码 |
def get_query_string(self): return self.url.queryPairDelimiter().join( "{0}{1}{2}".format(k, self.url.queryValueDelimiter(), v) for k, v in self.url.queryItems() ) |
请求的时候加上就行了
代码如下 | 复制代码 |
self.http.get(self.url.path() + "?" + self.get_query_string()) |
处理 Cookie ---- QNetworkAccessManager
QHttp 是无法自动记录 Cookie 和设置 Cookie的, 如果有这个需求就需要 PyQt4.QtNetwork.QNetworkAccessManager
代码如下 | 复制代码 |
QNetworkAccessManager 的请求方法不在是传入一个 QString, 而是需要传入一个 PyQt4.QtNetwork.QNetworkRequest 的实例. QNetworkAccessManager 同样是异步的, 可以绑定 QNetworkAccessManager.finished 信号, 这个信号将会给槽传递一个 PyQt4.QtNetwork.QNetworkReply 的实例. QNetworkAccessManager.setCookieJar 可以设置一个 PyQt4.QtNetwork.QNetworkCookieJar 对象来 自动保存和设置 Cookie. #!/usr/bin/env python
self.manager = QtNetwork.QNetworkAccessManager(parent=self) self.manager.setCookieJar(self._cookiejar) self.manager.finished.connect(self.on_reply) self.req = QtNetwork.QNetworkRequest( self.manager.get(self.req) def on_reply(self, reply):
|
这样就可以携带 Cookie 去请求一些需要 Cookie 认证的请求.
总结
还有很多内容就不一一介绍, 比如配合 QProgressBar, 添加头部信息, POST 请求, 等.
这里只是简单介绍下 Qt 自己的网络请求处理方法. 在 PyQt 里用 urllib 等库明显不是好的 解决办法, 因为会造成界面卡死. 但是 PyQt4 的方式也实在不是很优雅. 要来来回回的调很多 东西. 但是最起码不会造成界面的卡死.
-
上一个: python列表和元组之学习笔记
-
下一个: PHP中利用Xdebug进行远程错误调试
相关文章
- PHP导出数据超时的优化建议解读 10-31
- PHP之mysql位运算解析 10-31
- Laravel实现登录跳转功能解析 10-31
- php双向队列解读 10-31
- Laravel异常上下文解决教程 10-24
- php数组查询元素位置方法介绍 10-24