如何在 QNetworkAccessManager 中保存/加载 cookie

Posted

技术标签:

【中文标题】如何在 QNetworkAccessManager 中保存/加载 cookie【英文标题】:how to save/load cookies to/from QNetworkAccessManager 【发布时间】:2016-01-23 17:05:44 【问题描述】:

我使用 QNetworkAccessManager 加载页面并登录到一些站点。我想保存 cookie 并使用这个程序将它们加载到下一个。

我写这段代码来保存cookies:

import shelve
self.netManager=QNetworkAccessManager()
#... Load Pages and Login ....
with shelve.open('LoginDb','c') as db:
    db['cooki']=netManager.CookieJar()

以及加载cookies的代码:

with shelve.open('LoginDb','c') as db:
    self.netManager.setCookieJar(db['cooki'])

但是 setCookieJar 不起作用并出现此错误:

从未调用过 QNetworkCookieJar 类型的超类 init()

我该怎么做?

【问题讨论】:

【参考方案1】:

该错误消息通常意味着您继承了QNetworkCookieJar 并忘记调用超类__init__。你应该这样做(假设 Python 3):

class CookieJar(QNetworkCookieJar):

    def __init__(self, parent):
        super().__init__(parent)  # You probably don't do this
        # Do custom stuff here

我还建议不要使用shelve。它脆弱、缓慢,而且在某些情况下 场景存在安全风险。我个人只是将它们存储在一个纯文本文件中 我的项目 - 像这样:

class CookieJar(QNetworkCookieJar):

    # [...]

    def parse_cookies(self):
        cookies = []
        with open('cookies', 'r') as f:
            for line in f:
                cookies += QNetworkCookie.parseCookies(line)
        self.setAllCookies(cookies)

    def save(self):
        with open('cookies', 'w') as f:
            for cookie in self.allCookies():
                if not cookie.isSessionCookie():
                    f.write(cookie.toRawForm() + '\n')

【讨论】:

【参考方案2】:

我认为您需要使用来自 QNetWork 的 cookiejar,

import shelve
self.netManager=QNetworkAccessManager()
#... Load Pages and Login ....
with shelve.open('LoginDb','c') as db:
    db['cooki']= QtNetwork.QNetworkCookieJar(parent=self)

【讨论】:

以上是关于如何在 QNetworkAccessManager 中保存/加载 cookie的主要内容,如果未能解决你的问题,请参考以下文章

QNetworkAccessManager - 如何发送 MultiPart “PATCH” 请求

如何使用 QNetworkAccessManager 发布 Unicode 数据

如何使用 QNetworkAccessManager 发送 DELETE 请求?

如何从一个 QNetworkAccessManager 发送回复?

在 QtWebkit 中,如何调用网页的 QNetworkAccessManager::createRequest()?

如何获取 QNetworkAccessManager 连接状态?