2016-01-23 57 views
2

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

我写这段代码保存的cookies:

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

,这代码加载饼干:

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

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

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

我能做些什么来做到这一点?

回答

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') 
1

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

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

它不工作(在同样的错误!)。 –