Python: постоянный cookie, генерирует поле `expires` - PullRequest
8 голосов
/ 02 июля 2011

Я пытаюсь сгенерировать текст для постоянного куки в простом веб-приложении Python.

У меня проблемы с поиском способа создания поля expires. Текстовый формат для поля несколько сложен, и я бы не стал писать код для его генерации самостоятельно.

Есть ли в Python что-нибудь, что поможет? Я готовил в документах для cookie и cookielib, и они, кажется, занимаются большой частью бизнеса печенья, за исключением генерации поля expires

Ответы [ 4 ]

12 голосов
/ 02 июля 2011

Я думаю, вы хотите сделать что-то вроде этого:

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=/
4 голосов
/ 25 июля 2014

Если я прав, при использовании Cookie.SimpleCookie вы можете просто указать TTL в секундах для поля expires что-то вроде:

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 голосов
/ 26 мая 2017

Я расширяю предыдущий комментарий и половину ответа, надеюсь, пригодный для использования ответ.

Насколько мне известно, он дает наиболее правильный и удобный формат даты 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(), которая производит пробелы вместо удобных - 's (хорошо согласно RFC, но не распознается всеми браузерами).Эта функция допускает только относительную синхронизацию и является недокументированной функцией.Однако он также может быть использован недокументированной функцией, что вы можете дать целые секунды (но не с плавающей точкой!) Для поля expires в 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).

0 голосов
/ 09 октября 2012

Python's time.strftime() может форматировать заданное время для печенья 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», иметь его, вероятно, безопаснее.

Основано на ответе Гарета Риса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...