2011-07-02 16 views
6

Próbuję wygenerować tekst dla trwałego pliku cookie w prostej aplikacji internetowej Python.Python: Trwałe ciasteczko, generuj pole `expires`e

Mam problem ze znalezieniem sposobu wygenerowania pola expires. Format tekstu dla tego pola jest nieco skomplikowany i wolałbym nie pisać kodu, aby sam go wygenerować.

Czy jest coś w języku Python, które pomoże? Mam gotowane na docs dla cookie i cookielib i wydają się obsługiwać wiele działalności Cookie, z wyjątkiem wytwarzania pola expires

+0

Możesz po prostu ustawić pola 'expires' jako liczbę całkowitą sekund w przyszłość/przeszłość. Float nie działa. Zobacz 'http.cookies._getdate()'/'Cookie._getdate()'. Wydaje się po prostu nie udokumentowane. – kxr

Odpowiedz

8

Myślę, że chcesz zrobić coś takiego:

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

Czy ustawienie nie wygasa do 0 tworzenia pliku cookie sesji? Szukam utworzenia trwałego pliku cookie z niezerową wartością wygasania. – Mike

+0

Zaktualizowany przykład z ustawionym plikiem cookie wygasa za 30 dni – zeekay

0

Pythona time.strftime() można sformatować dany czas na cookie expires według 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) 

wyjściowa:

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

Strefy czasowe należy zignorować, ale ponieważ wszystkie przykłady mają "GMT", prawdopodobnie jest bezpieczniej.

Na podstawie Gareth Rees' answer.

4

Jeśli mam rację, gdy za pomocą Cookie.SimpleCookie można po prostu określić TTL sekund wygasa coś pola jak:

from Cookie import SimpleCookie 

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

Wyjście c.output() powróci coś takiego:

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

Rozszerzam poprzedni komentarz i połowę odpowiedzi, mam nadzieję, że nadaję się do użytku.

Ten produkuje mojej wiedzy najbardziej poprawne i wygodny format daty cookies w jednym szybkim funkcji - przyjęta przez dowolny, nawet stare i dziwne, przeglądarek - akceptuje absolutną & czas względna:

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) 

Funkcja ewoluowała z Cookie._getdate()/http.cookies._getdate(), która tworzy przestrzenie zamiast wygodnych - (zgodnie z RFC, ale nie jest rozpoznawana przez wszystkie przeglądarki). Ta funkcja pozwala tylko na względny czas i jest funkcją nieudokumentowaną. Jednak może on być stosowany przez również nieudokumentowanych funkcji, które można dać całkowite sekund upływa pole w SimpleCookie kąski, które są następnie interpretowane względem jako sekund w przyszłości/przeszłości (ale nie pływać!):

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

Często używany time.strftime("%a, %d %b %Y %T GMT", t_expires) jest wątpliwy, ponieważ zależy od ustawień regionalnych (% a,% d) i specyfikacji nieudokumentowanego formatu specyficznego dla systemu operacyjnego (% T nie jest zrozumiałe na przykład w Windowsie).