2011-07-02 22 views
6

Basit bir Python web uygulamasında kalıcı bir çerez için metin oluşturmaya çalışıyorum.Python: Kalıcı çerez, 'expires' alanını oluştur

expires alanını oluşturmanın bir yolunu bulmakta zorlanıyorum. Alanın metin formatı biraz karmaşık ve kendim oluşturmak için kod yazmamayı tercih ediyorum.

Python'da yardımcı olacak bir şey var mı? Ben cookie ve cookielib için docs de pişmiş ettik ve onlar

+0

Sadece 'expires' alanlarını saniye cinsinden tam sayı olarak gelecek/geçmişe ayarlayabilirsiniz. Şamandıra çalışmıyor. 'Http.cookies._getdate()'/'Cookie._getdate()' konusuna bakın. Belgelenmemiş gibi görünüyor. – kxr

cevap

8

Ben böyle bir şey yapmak istiyorum düşünüyorum expires alan oluşturarak haricinde çerez iş bir sürü işlemek gibi görünüyor:

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

Ayar bitmeden ayarlanacak 0 bir oturum çerezi oluşturulsun mu? Sıfır olmayan bir son kullanma değerine sahip kalıcı bir çerez oluşturmaya çalışıyorum. – Mike

+0

30 gün içinde sona erecek şekilde çerez seti ile güncellenmiş örnek – zeekay

0

Python en time.strftime() için belirli bir zaman biçimlendirebilirsiniz bir çerez en expires göre RFC 6265 için:

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) 

Çıktı:

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

Zaman dilimleri göz ardı edilmeli, ancak tüm örneklerin "GMT" olması nedeniyle muhtemelen daha güvenli olması gerekir.

Gareth Rees' answer tabanlıdır.

4

Cookie.SimpleCookie kullanırken ben haklıyım, sadece için saniyede TTL belirtebilirsiniz gibi saha şey bitiş tarihi:

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

from Cookie import SimpleCookie 

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

gibi bir şey dönecektir c.output() çıktısı

0

Bir önceki yorumu ve ümit verici bir cevap vermek için yarım bir cevabı genişletiyorum. Herhangi tarafından kabul, hatta eski ve garip tarayıcılar - -

Bu seferki bilgim tek hızlı işlevinde en doğru ve kullanışlı çerez tarih biçimi için üretir kabul & mutlak bağıl zaman:

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) 

İşlev, uygun -'leri yerine (RFC'ye göre tamam, ancak tüm tarayıcı tarafından tanınmıyor) boşluklar üreten Cookie._getdate()/http.cookies._getdate()'dan gelişmiştir. Bu işlev sadece göreceli zamanlamaya izin verir ve belgesiz bir işlevdir. Ancak sen tamsayı saniye verebileceği, aynı zamanda belgesiz özelliği tarafından kullanılabilecek daha sonra gelecek/geçmişe saniye olarak göreceli yorumlanır SimpleCookie parÁacıkları alanına sona için (ancak yüzer değil!):

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

Sık kullanılan time.strftime("%a, %d %b %Y %T GMT", t_expires), yerel ayarlara (% a,% d) ve OS'ye özgü belgesiz biçim özelliklerine (Windows'da anlaşılmayan% T) bağlı olduğundan, sorgulanabilirdir.

İlgili konular