обновляйте запросы.заголовок session() после каждого запроса

#python #python-requests #session-cookies

#python #python-запросы #сессия-файлы cookie

Вопрос:

Я пишу клиент python для RESTful API с использованием запросов.Сессия. API генерирует и возвращает новый CSRFToken после каждого запроса. Разработчики API сказали мне, что мне нужно обновить заголовки сеанса следующим образом:

 csrf = session.cookies.get('CSRFToken')
session.headers.update({'x-csrf-token': csrf})
 

Как я могу привязать эту функциональность к объекту сеанса, чтобы эта функциональность автоматически вызывалась после каждого запроса (возможно, возможно хорошее решение наследования), чтобы пользователь не вызывал ее после каждого запроса?

Комментарии:

1. Вы могли бы написать свой собственный класс, который подклассы объекта сеанса

2. @DarkKnight да, я так и думал, но у вас есть подсказка, где я должен перезаписать класс сеанса? github.com/psf/requests/blob/main/requests/sessions.py здесь, вероятно, в функции запроса, но я не знаю, где и как именно

Ответ №1:

Вот минимальный пример того, что вы могли бы сделать:

 import requests

class MySession(requests.Session):
    def __init__(self):
        super().__init__()
        self.headers = dict()
    def get(self, url):
        if (c := self.cookies.get('CSRFToken')):
            self.headers['x-csrf-token'] = c
        return super().get(url, headers=self.headers)


with MySession() as session:
    (r := session.get('https://www.google.com')).raise_for_status()
 

Комментарии:

1. Спасибо за ваше быстрое решение! Я обновил его, чтобы он работал для всех запросов, а не только для GET. Я думаю, что инициализацию не нужно перезаписывать, поскольку существует self.headers = default_headers() .

2. @LukasWeber Обратите внимание, что я ясно дал понять, что это минимальное решение. Вам нужно будет проделать гораздо больше работы, чтобы подготовить это производство. Кроме того, хорошо сделано для обнаружения requests.utils

3. есть ли у вас права на утверждение изменений?