2011-01-13 60 views
11

如何創建cookie並將其添加到python中的CookieJar實例? 我有cookie的所有信息(名稱,值,域,路徑等),我不想提取一個新的cookie與http請求。python - 將cookie添加到cookiejar

我試過,但它看起來像SimpleCookie類是不CookieJar兼容(?有另一種餅乾類)

import Cookie 
c = Cookie.SimpleCookie() 
c["name"]="value" 
c['name']['expires'] = 0 
c['name']['path'] = "/" 
c['name']['domain'] = "mydomain.com" 
cj = cookielib.CookieJar() 
cj.set_cookie(cookie) 

Traceback (most recent call last): 
    cj.set_cookie(cookie) 
    File "/usr/lib/python2.6/cookielib.py", line 1627, in set_cookie 
    if cookie.domain not in c: c[cookie.domain] = {} 
AttributeError: 'SimpleCookie' object has no attribute 'domain' 
+1

你使用的是什麼環境?這些東西已經在python web服務和請求框架中重新實現了很多。 – 2012-10-01 21:37:29

回答

11

看着cookielib,您可以:

try: 
    from cookielib import Cookie, CookieJar   # Python 2 
except ImportError: 
    from http.cookiejar import Cookie, CookieJar # Python 3 
cj = CookieJar() 
# Cookie(version, name, value, port, port_specified, domain, 
# domain_specified, domain_initial_dot, path, path_specified, 
# secure, discard, comment, comment_url, rest) 
c = Cookie(None, 'asdf', None, '80', '80', 'www.foo.bar', 
     None, None, '/', None, False, False, 'TestCookie', None, None, None) 
cj.set_cookie(c) 
print cj 

給出:

<cookielib.CookieJar[<Cookie asdf for www.foo.bar:80/>]> 

對實例化參數沒有真正的理性檢查。端口必須是字符串,而不是int。

+0

而True則不會觸及「Cookie」模塊是否可以與「cookielib」模塊兼容,或者不是。 – n611x007 2013-11-03 19:17:37

+1

也許你會在這種情況下創建一個自己的`Cookie`類型,它提供了兩個接口。 Cookiejar並不是真正挑剔什麼它作爲一個cookie。新的cookie只需要`domain`,`path`和`name`屬性,並且不能有`items`。基本上就是這樣。 `cookielib`內部實際上是一些輕量級的講座,易於消化和非常推薦的閱讀。 – Michael 2013-12-17 19:03:32

2

這裏的關鍵點是cj.set_cookie預計cookielib.Cookie類的對象作爲其參數,其方法(因此是的,有另一個Cookie類Cookie.SimpleCookie類的一個對象(或任何其它類的模塊發現Cookie)。儘管名稱的相似性令人困惑,但這些類(如觀察到的)完全不兼容。

請注意,cookielib.Cookie的構造函數的參數列表可能在過去的某個時間點發生了變化(並且可能會在將來再次發生變化,因爲此類似乎並不期望在cookielib之外使用),至少help(cookielib.Cookie)目前給我

# Cookie(version, name, value, port, port_specified, domain, 
# domain_specified, domain_initial_dot, path, path_specified, 
# secure, expires, discard, comment, comment_url, rest, rfc2109=False) 

注意額外expires參數和使用,但不是參數rfc2109在@邁克爾的回答上面的代碼記錄,因此例如應該成爲像

c = Cookie(None, 'asdf', None, '80', True, 'www.foo.bar', 
    True, False, '/', True, False, '1370002304', False, 'TestCookie', None, None, False) 

(也適用於替換None的某些布爾常量)。