Пытаясь получить токен csrf из объекта cookiejar

Я использую приведенный ниже код на основе этого ответа для хранения файлов cookie аутентификации в файле. Это позволяет мне не входить в систему каждый раз, когда я запускаю программу.

Теперь получение csrftoken из обычных файлов cookie сеанса работает хорошо, но когда я пытаюсь получить его из файла cookiejar с помощью csrf = s.cookies['csrftoken'], я получаю

AttributeError: LWPCookieJar instance has no attribute '__getitem__'`

Я понимаю, что это происходит, потому что я рассматриваю s.cookies как список, хотя теперь это объект LWPCookieJar. Я полагаю, это оставляет мне два варианта:

Либо:

  • Извлеките список из объекта LWPCookieJar, а затем легко получите токен csrf.
  • или Найдите подходящий синтаксис для получения токена csrf непосредственно из файла LWPCookieJar.

Как я могу это сделать?


import os
import requests
from cookielib import LWPCookieJar

s = requests.Session()
s.cookies = LWPCookieJar('cookiejar')
if os.path.exists('cookiejar'):
    # Load saved cookies from the file and use them in a request
    print('loading saved cookies')
    s.cookies.load()        
else:
    # Create a new cookies file and set our Session's cookies
    print('saving cookies')
    s.cookies.save()
r = s.get('http://httpbin.org/cookies')
print(r.text)
# Save the session's cookies back to the file
s.cookies.save()

person octosquidopus    schedule 12.11.2014    source источник
comment
Вы можете запустить dir(s.cookies)?   -  person kylieCatt    schedule 12.11.2014
comment
@IanAuld: да. Он возвращает очень длинный список.   -  person octosquidopus    schedule 13.11.2014
comment
Что ж, этот список содержит все атрибуты и методы, связанные с этим объектом. Есть ли там тот, который звучит так, как будто он будет делать то, что вы хотите?   -  person kylieCatt    schedule 13.11.2014


Ответы (1)


Я наконец-то понял. Не уверен, что это можно еще упростить.

import os, requests
from cookielib import LWPCookieJar

def login():
    global s
    s = requests.Session()
    if os.path.exists('cookiejar'):
        print('Cookies exist! Fast login.\r'),
        global csrf
        with open('cookiejar') as f:
            s.cookies = requests.utils.cookiejar_from_dict(pickle.load(f))
        csrf = s.cookies['csrftoken']
        print('csrf: {0}').format(csrf) # Debug information
    else:
        print('Cookies do not exist. Slow login.\r'),
        s.get('http://www.example.com/') # to get csrf
        csrf = s.cookies['csrftoken']
        data= dict(csrftoken=csrf, username="user", password="pass")
        s.post('https://www.example.com/login/', data=data, headers=headers)
        with open('cookiejar', 'w') as f:
            pickle.dump(requests.utils.dict_from_cookiejar(s.cookies), f)
person octosquidopus    schedule 08.12.2014