#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. есть ли у вас права на утверждение изменений?