zilevsky
@zilevsky

Нужно ли закрывать сессию при requests?

Есть сервис с api с которого я хочу получать данные.
Для доступа сервис выдаёт токены, которые живут 12 часов.

Порядок действий:
1. Создаю сессию session_requests = Session()
2. Создаю запрос через requests на получение токена
3. Добавляю токен в header и создаю запрос на получение данных

Вопросов несколько
1. Я пока не использую базу данных, но поскольку токен живёт 12 часов думаю излишне запрашивать его каждый раз.
Какие есть практики для такого случая?
Как я понимаю есть несколько вариантов, но все сомнительные.
Первый, хранить токен в глобальной переменной. Второй, хранить в файле. Третий, хранить в env. Ну и четвёртый не хранить и запрашивать каждый раз.

2. Стоит ли разбивать на отдельные методы запрос на получение токена и запрос на получение данных?
Какие есть практики на этот случай?

3. Нужно ли закрывать сессию по типу такой конструкции?
with Session() as s:
    s.get(...)
    s.get(...)
    s.get(...)


3.1 Если разбивать получение токена и данных на отдельные методы, то нужно ли закрывать сессии в каждом методе?

Скорее всего для таких случаев есть какие-то отработанные паттерны, но я их к сожалению не знаю:)
  • Вопрос задан
  • 504 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
1. Чем не устраивают обозначенные варианты? Если токен должен переживать перезапуск, храни его в конфигурации. Если не должен, храни его только в памяти - в глобальной переменной или в атрибуте класса.
2. Конечно стоит. Просто для того, чтобы при истечении токена на полпути его можно было перезапросить прозрачно для клиентского кода. Например, декоратор вида:
def requires_token(func):
    @functools.wraps(func)
    def wrapper(self, *args, **kwargs):  #оборачиваем метод, а не функцию
        try:
            result = func(self, *args, **kwargs)  # пробуем вызвать метод как есть
        except InvalidToken:  # кастомное исключение, которое должны выбрасывать методы
            self._acquire_new_token()  # получаем новый токен
            result = func(self, *args, **kwargs)  # пробуем еще раз
        return result

    return wrapper

Тогда любой декорированный метод, который выбрасывает исключение InvalidToken, спровоцирует автоматический запрос нового токена и одну повторную попытку выполнения операции.
Но можно делать это и явно, в каждом методе.
3. Под закрытием сессии ты понимаешь инвалидацию токена, т.е. невозможность его дальнейшего использования? Ну так это тебя нужно спрашивать, нужно ли закрывать сессию и требует ли используемое API явного закрытия сессии. Планируешь ли ты выполнять дальнейшие операции в рамках этой сессии? Если точно нет, можешь закрывать - например, при выходе из скрипта. Заодно снимется вопрос о хранении токена. Если не хочешь дёргать получение токена понапрасну, тогда храни токен, но не закрывай.
Делать это в КАЖДОМ методе точно бессмысленно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы