【问题标题】:how to save/load cookies to/from QNetworkAccessManager如何在 QNetworkAccessManager 中保存/加载 cookie
【发布时间】: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()

我该怎么做?

【问题讨论】:

    标签: qt pyqt qnetworkaccessmanager


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2013-02-10
        • 1970-01-01
        • 2013-10-11
        相关资源
        最近更新 更多