如何在QNetworkAccessManager

时间:2016-01-23 17:05:45

标签: 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无法正常工作并出现此错误:

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

我该怎么办呢?

2 个答案:

答案 0 :(得分:1)

我认为你需要使用QNetWork的cookiejar,

alvas@ubi:~$ python -mtimeit 'from nltk.corpus import wordnet as wn'
10 loops, best of 3: 1.1 usec per loop
alvas@ubi:~$ python -mtimeit 'from pattern.en import wordnet as wn'
1000000 loops, best of 3: 0.702 usec per loop
alvas@ubi:~$ python -mtimeit 'from nltk.corpus import wordnet as wn; wn.synsets("man")'
10 loops, best of 3: 22 usec per loop
alvas@ubi:~$ python -mtimeit 'from pattern.en import wordnet as wn; wn.synsets("man")'
10000 loops, best of 3: 81.8 usec per loop

答案 1 :(得分: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')