2011-01-13 35 views
11

Làm thế nào để tạo một cookie và thêm nó vào một cá thể CookieJar trong python? Tôi có tất cả thông tin cho cookie (tên, giá trị, tên miền, đường dẫn, v.v.) và tôi không muốn trích xuất một cookie mới có yêu cầu http.python - thêm cookie vào cookiejar

Tôi cố gắng này nhưng có vẻ như SimpleCookie lớp là không tương thích với CookieJar (? Là có một lớp Cookie)

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

Ngữ cảnh bạn đang sử dụng là gì? Công cụ này đã được reimplemented rất nhiều trong python web phục vụ và yêu cầu khuôn khổ. –

Trả lời

11

Nhìn vào cookielib, bạn nhận được:

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 

Cung cấp:

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

Không có kiểm tra độ chính xác thực cho các tham số khởi tạo. Các cổng phải là chuỗi, không phải int.

+0

trong khi True, điều này không liên lạc liệu mô-đun 'Cookie' có thể được thực hiện tương thích với mô đun' cookielib' hay không. – n611x007

+1

Có lẽ bạn sẽ chỉ tạo một loại 'Cookie' riêng trong trường hợp đó, cung cấp cả hai giao diện. Cookiejar không thực sự cầu kỳ về những gì nó nhận được như một cookie. Cookie mới chỉ yêu cầu thuộc tính 'miền',' đường dẫn' và 'tên' và không được có' mục'. Đó là về cơ bản. 'cookielib' internals thực sự là một số bài giảng nhẹ, dễ tiêu hóa và đọc rất khuyến khích. – Michael

+0

Tôi vừa nhận thấy - Cookie() có 15 tham số và bạn cung cấp 16 thông số khi gọi. Đây có phải là lỗi đánh máy không? – reedog117

2

Điểm quan trọng ở đây là phương pháp cj.set_cookie hy vọng một đối tượng của lớp cookielib.Cookie như tham số của nó (vì vậy vâng, có một lớp Cookie), không một đối tượng của lớp Cookie.SimpleCookie (hoặc bất kỳ lớp khác được tìm thấy trong mô-đun Cookie). Các lớp này (như được quan sát) chỉ đơn giản là không tương thích, mặc dù sự tương tự khó hiểu của tên.

Lưu ý rằng danh sách tham số của hàm tạo cho cookielib.Cookie có thể đã thay đổi tại một số điểm trong quá khứ (và có thể thay đổi lại trong tương lai vì lớp này dường như không được mong đợi sử dụng bên ngoài cookielib) help(cookielib.Cookie) hiện mang lại cho tôi

# 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) 

Lưu ý thêm expires tham số và tham số rfc2109 sử dụng nhưng không ghi nhận trong các mã trong @ Michael trả lời ở trên, vì vậy ví dụ nên trở thành một cái gì đó giống như

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

(cũng thay thế một số hằng số Boolean cho None nếu có).

+0

nếu hai không tương thích, các mô-đun nào đang sử dụng một trong hai loại tương ứng? ví dụ. 'Cookie' có tương thích với bất kỳ mô-đun thư viện chuẩn nào không? những gì về 'cookielib'? Tại sao người ta lại muốn sử dụng cái kia? – n611x007

Các vấn đề liên quan