2011-07-02 38 views
6

Tôi đang cố gắng tạo văn bản cho cookie liên tục trong một ứng dụng web Python đơn giản.Python: Cookie liên tục, tạo trường `expires`

Tôi đang gặp sự cố khi tìm cách tạo trường expires. Định dạng văn bản cho trường này hơi phức tạp và tôi không muốn viết mã để tự tạo ra nó.

Có điều gì đó bằng Python sẽ giúp ích không? Tôi đã nấu chín tại các tài liệu cho cookiecookielib và họ dường như xử lý rất nhiều công việc kinh doanh cookie, ngoại trừ để tạo ra các expires lĩnh vực

+0

Bạn chỉ có thể đặt trường 'hết hạn' là số nguyên giây trong tương lai/quá khứ. Float không hoạt động. Xem 'http.cookies._getdate()'/'Cookie._getdate()'. Có vẻ như không có tài liệu. – kxr

Trả lời

8

Tôi nghĩ rằng bạn muốn làm một cái gì đó như thế này:

import Cookie, datetime, uuid 
ck = Cookie.SimpleCookie() 

ck['session'] = str(uuid.uuid4()) 
ck['session']['domain'] = 'foo.com' 
ck['session']['path'] = '/' 
expires = datetime.datetime.utcnow() + datetime.timedelta(days=30) # expires in 30 days 
ck['session']['expires'] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") 

>>> print ck.output() 
Set-Cookie: session=9249169b-4c65-4daf-8e64-e46333aa5577; Domain=foo.com; expires=Mon, 01 Aug 2011 07:51:53 GMT; Path=/ 
+0

Sẽ không đặt hết hạn để 0 tạo cookie phiên? Tôi đang tìm cách tạo một cookie liên tục với giá trị hết hạn khác không. – Mike

+0

Ví dụ được cập nhật với cookie được đặt hết hạn sau 30 ngày – zeekay

0

Python của time.strftime() có thể định dạng một thời gian nhất định cho một cookie sẽ expires theo RFC 6265:

import time 
lease = 14 * 24 * 60 * 60 # 14 days in seconds 
end = time.gmtime(time.time() + lease) 
expires = time.strftime("%a, %d-%b-%Y %T GMT", end) 
print(expires) 

Output:

Tue, 23-Oct-2012 17:10:51 GMT 

Các múi giờ phải được bỏ qua, nhưng vì tất cả các ví dụ đều có "GMT" nên việc này có thể an toàn hơn.

Dựa trên Gareth Rees' answer.

4

Nếu tôi đúng, khi sử dụng Cookie.SimpleCookie bạn chỉ có thể xác định TTL trong vài giây cho hết hạn cái gì đó lĩnh vực như:

from Cookie import SimpleCookie 

c = SimpleCookie() 
c['sid'] = 'xxx' 
c['sid']['path'] = '/' 
c['sid']['expires'] = 12 * 30 * 24 * 60 * 60 # 1 year 

Kết quả của c.output() sẽ trở lại một cái gì đó như:

'Set-Cookie: sid=xxx; expires=Mon, 20 Jul 2015 14:42:35 GMT; Path=/' 
0

Tôi đang mở rộng nhận xét trước và trả lời một nửa để hy vọng câu trả lời có thể sử dụng được.

một này tạo ra để kiến ​​thức của tôi một định dạng chính xác và thuận tiện nhất ngày cookie trong một chức năng nhanh chóng duy nhất - chấp nhận bởi bất kỳ, thậm chí cũ và lẻ, trình duyệt - chấp nhận tuyệt đối & thời gian tương đối:

import time 
_weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] 
_monthname = [None, 
       'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 

def cookie_date(epoch_seconds=None, future=0): 
    if not epoch_seconds: 
     epoch_seconds = time.time() 
    year, month, day, hh, mm, ss, wd, y, z = time.gmtime(epoch_seconds + future) 
    return "%s, %02d-%3s-%4d %02d:%02d:%02d GMT" % \ 
      (_weekdayname[wd], day, _monthname[month], year, hh, mm, ss) 

Chức năng này được phát triển từ Cookie._getdate()/http.cookies._getdate(), tạo ra không gian thay vì thuận tiện - 's (ok theo RFC, nhưng không được nhận diện bởi tất cả trình duyệt). Hàm này chỉ cho phép thời gian tương đối và là một hàm không có giấy tờ. Tuy nhiên nó có thể được sử dụng bởi các tính năng cũng không có giấy tờ, mà bạn có thể cung cấp cho số nguyên giây cho hết hạn lĩnh vực trong SimpleCookie mẩu, mà sau đó được giải thích tương đối như giây trong tương lai/quá khứ (nhưng không nổi!):

cookie_morsel['expires'] = +3600 # 1h into future; 3600.0 doesn't work! 

Thường được sử dụng time.strftime("%a, %d %b %Y %T GMT", t_expires) là có vấn đề, bởi vì nó phụ thuộc vào cài đặt miền địa phương (% a,% d) và đặc tả định dạng không có giấy tờ tùy thuộc vào hệ điều hành (% T không hiểu trên Windows ví dụ).

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