2011-07-02 110 views
6

我想在一個簡單的Python web應用程序中生成持久cookie的文本。Python:持久cookie,生成`expires`字段

我無法找到生成expires字段的方法。該字段的文本格式有點複雜,我寧願不編寫代碼來自己生成它。

Python中是否有幫助?我已經在文檔的cookiecookielib熟,他們似乎處理很多的餅乾業務,除了產生expires

+0

您可以將'expires'字段設置爲未來/過去的秒數。浮動不起作用。參見'http.cookies._getdate()'/'Cookie._getdate()'。這似乎只是沒有記錄。 – kxr

回答

8

我想你想要做這樣的事情:

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

將不會設置過期到0創建會話cookie?我正在尋找創建一個非零到期價值的持久cookie。 – Mike

+0

Cookie更新示例設置爲在30天內過期 – zeekay

0

Python的time.strftime()可以格式化給定時間對cookie的expires根據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) 

輸出:

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

時區應該被忽略,但是因爲所有的例子都有「GMT」,所以它可能更安全。基於Gareth Rees' answer

4

如果我是正確的,使用Cookie.SimpleCookie時,你可以指定以秒爲TTL過期領域是這樣的:

from Cookie import SimpleCookie 

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

c.output()輸出將返回類似:

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

我正在擴大以前的評論和一半的答案,希望有用的答案。

這一個產生,據我所知一個最正確的和方便的cookie的日期格式在一個單一的快捷功能 - 通過任何被接受的,甚至是老奇,瀏覽器 - 接受絕對&相對時間:

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) 

函數從Cookie._getdate()/http.cookies._getdate()發展而來,它產生空格而不是方便的-(根據RFC確定,但沒有被所有瀏覽器識別)。該功能僅允許相對時間,並且是未公開的功能。但是它可以通過也未記錄的功能可以使用,你可以給整秒的SimpleCookie的點點滴滴,然後相爲秒演繹成未來/過去的到期場(但不是飄!):

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

經常使用的time.strftime("%a, %d %b %Y %T GMT", t_expires)是有問題的,因爲它取決於語言環境設置(%a,%d)和特定操作系統特定的未記錄格式規範(%T在Windows上不能理解)。