Cookies и HTTP с Python - PullRequest
       21

Cookies и HTTP с Python

0 голосов
/ 19 февраля 2010

Я хочу "получить" куки, отправленные клиентом в моем подклассе BaseHTTPRequestHandler.

Во-первых, я не уверен в точной последовательности отправки заголовков, в типичном HTTP-запросе и ответе это мое понимание последовательности событий:

  1. Клиент отправляет запрос (метод, путь, версия HTTP, хост и ВСЕ заголовки).
  2. Сервер отвечает кодом ответа, за которым следует несколько собственных заголовков.
  3. Затем сервер отправляет тело ответа.

Когда именно отправляются данные POST клиента? Происходит ли какое-либо перекрытие в этой последовательности, как описано выше?

Во-вторых, когда можно с уверенностью предположить, что заголовок «Cookie» был получен сервером. Должны ли все клиентские заголовки быть получены к моменту, когда self.send_response вызван сервером? Когда в HTTP-сообщении подходящее время заглядывать в заголовки файлов cookie в self.headers?

В-третьих, - это канонический способ анализа файлов cookie в Python. В настоящее время я считаю, что Cookie.SimpleCookie должен быть создан, а затем данные из заголовков cookie каким-то образом поступают в него. Еще одно затуманивание этой проблемы - это непонимание классов Cookie при работе с интерфейсами HTTPRequestHandler. Почему выходные данные из Cookie.output() не заканчиваются разделителем строки, чтобы поместиться в self.wfile.write(cookie.output()), или вместо этого отбрасывают неявно предоставленное имя заголовка, чтобы вписаться в self.send_header("Set-Cookie", cookie.output())

Наконец, классы cookie в модуле Cookie создают иллюзию, что они являются словарями словарей. Присвоение разных ключей в куки не упаковывает больше данных в куки, а скорее генерирует больше куки ... все очевидно в одном классе, и каждый генерирует свой собственный заголовок Set-Cookie. Каков наилучший способ упаковки контейнеров значений в cookie-файл (ы)?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

HTTP - протокол запроса / ответа, без перекрытия;тело запроса POST является частью запроса (если, конечно, глагол POST).

Все заголовки также входят в состав запроса, включая Cookie: , если есть (конечно, такого заголовка может не быть, например, когда браузер работает с отключенными файлами cookie или что-то еще).Так что заглядывайте в заголовки всякий раз, когда вы получили запрос и обслуживаете его.

Я не уверен, в чем заключается ваша "третья" проблема.Никакой символ новой строки не вставляется, если ни один из них не является частью файла cookie - почему так должно быть? Редактировать : см. Позже.

В четвертом пункте, я думаю, вы можете путать куки с "кусочками".Не существует ограничения на количество заголовков Set-Cookie в HTTP-ответе, так почему же это проблема?

Редактировать : при желании вы можете передать output до трех аргументов:набор атрибутов кусочков, которые вы хотите использовать в выходных данных для каждого кусочка (по умолчанию None означает все атрибуты), строку заголовка, которую вы хотите использовать перед каждым кусочком (по умолчанию Set-Cookie:), требуемую строку разделителя между кусочками (по умолчанию \r\n).Таким образом, кажется, что вы планируете использовать cookie-файл однократно (иначе вы не можете вставить строковое представление в один заголовок, что вам больше всего нравится): в этом случае

thecookie.output(None, '')

даст вам именно ту строку, которую вы хотите.Просто создайте несколько SimpleCookie экземпляров с одним кусочком в каждом (поскольку один кусочек - это то, что помещается в один заголовок! -).

0 голосов
/ 28 января 2018

Вот быстрый способ получить куки без сторонних библиотек. Хотя он отвечает только на часть вопроса, он может отвечать на тот, который будет после большинства "посетителей".

import Cookie

def do_GET(self):
    #-----------------------------------------------
    cookies = {}
    cookies_string = self.headers.get('Cookie')
    if cookies_string:
      cookies = Cookie.SimpleCookie()
      cookies.load(cookies_string)
    #-----------------------------------------------
    if 'my-cookie' in cookies:
      print cookies['my-cookie'].value
    #-----------------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...