qt - 如何将 cookie 保存到 QNetworkAccessManager 或从 QNetworkAccessManager 加载 cookie

标签 qt pyqt qnetworkaccessmanager

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

我编写这段代码是为了保存cookie:

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

以及加载 cookie 的代码:

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

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

super-class init() of type QNetworkCookieJar was never called

我可以做什么来做到这一点?

最佳答案

该错误消息通常意味着您对 QNetworkCookieJar 进行了子类化,但忘记调用父类(super class) __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')

关于qt - 如何将 cookie 保存到 QNetworkAccessManager 或从 QNetworkAccessManager 加载 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34966303/

相关文章:

performance - 如何在 Qt4 中有效地移动像素图的像素

qt - 在 Qt 的源代码中显示错误和警告

multithreading - Qt5 : How to use qDebug() to log in a file, 多线程应用

Qt5 QNetworkAccessManager 完成信号从不发出

c++ - 在qt中从https读取Json

c++ - Qt/Qt Creator - 程序意外结束。 <程序路径> 崩溃

python - 难以正确显示 PyQt GUI 元素

python - QTcpSocket read 未发出

python - PyQt - 拖放到不同的 QLabel 小部件中

c++ - QNetworkAccessManager 在 libcrypto.so 的 lh_insert () 中崩溃