2011-07-02 9 views
6

Estoy tratando de generar el texto para una cookie persistente en una aplicación web de Python simple.Python: cookie persistente, genera el campo `expires`

Tengo problemas para encontrar la manera de generar el campo expires. El formato de texto para el campo es algo complicado, y prefiero no escribir código para generarlo yo mismo.

¿Hay algo en Python que pueda ayudar? Yo he cocinado en la documentación para cookie y cookielib y parece que manejar una gran cantidad del negocio de galletas, excepto para generar el campo expires

+0

Puede simplemente establecer los campos 'expira' como número entero de segundos en el futuro/pasado. Float no funciona. Ver 'http.cookies._getdate()'/'Cookie._getdate()'. Parece que no está documentado. – kxr

Respuesta

8

creo que quiere hacer algo como esto:

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

¿La configuración no vence a 0 crea una cookie de sesión? Estoy buscando crear una cookie persistente con un valor de caducidad distinto de cero. – Mike

+0

Ejemplo actualizado con cookie configurado para caducar en 30 días – zeekay

0

time.strftime() de Python puede dar formato a un tiempo dado para de una galleta expires acuerdo con 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) 

salida:

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

Las zonas horarias se deben ignorar, pero dado que todos los ejemplos tienen "GMT", tenerlo es probablemente más seguro.

Basado en Gareth Rees' answer.

4

Si estoy en lo cierto, cuando se utiliza Cookie.SimpleCookie que sólo puede especificar el TTL en segundos para el expira campo algo como:

from Cookie import SimpleCookie 

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

La salida de c.output() devolverá algo como:

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

Estoy expandiendo un comentario anterior y una respuesta a la mitad con suerte una respuesta utilizable.

Ésta produce que yo sepa, un formato más adecuado y conveniente fecha de galleta en una única función rápida - aceptado por cualquier, incluso el viejo y extraño, navegadores - acepta absoluta & tiempo relativo:

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) 

La función evolucionó de Cookie._getdate()/http.cookies._getdate(), que produce espacios en lugar de los convenientes - 's (está bien según RFC, pero no es reconocido por todos los navegadores). Esta función solo permite el cronometraje relativo y es una función no documentada. Sin embargo, puede ser utilizado por la función también indocumentado, que se puede dar segundos enteros para el campo expires en SimpleCookie bocados, que luego son interpretadas relativa como segundos en el futuro/pasado (pero no flotan!):

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

El time.strftime("%a, %d %b %Y %T GMT", t_expires) de uso frecuente es cuestionable, porque depende de la configuración regional (% a,% d) y de una especificación de formato no documentada específica del sistema operativo (% T no se entiende en Windows, por ejemplo).

Cuestiones relacionadas