【问题标题】:update requests.session() header after each request每次请求后更新 requests.session() 标头
【发布时间】:2022-01-09 15:02:13
【问题描述】:

我正在使用requests.Session 为 RESTful API 编写 Python 客户端。 API 在每次请求后生成并返回一个新的 CSRFToken。 API 的开发人员告诉我,我需要像这样更新会话标头:

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

如何在 Session 对象上绑定此功能,以便在每次请求后自动调用此功能(也许一个不错的继承解决方案可能是可能的),这样用户就不必在每次请求后调用它?

【问题讨论】:

  • 你可以编写自己的类来继承 Session 对象
  • @DarkKnight 是的,我是这么认为的,但你有什么提示我必须覆盖 Session 类吗? github.com/psf/requests/blob/main/requests/sessions.py 这里可能在请求函数中,但我不知道具体在哪里以及如何

标签: python python-requests session-cookies


【解决方案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()

【讨论】:

  • 感谢您的快速解决方案!我对其进行了更新,使其适用于所有请求,而不仅仅是 GET。我认为 init 不必被覆盖,因为 self.headers = default_headers() 存在。
  • @LukasWeber 请注意,我明确表示这是一个最小解决方案。你需要做更多的工作来准备好这个生产。此外,在发现 requests.utils 方面做得很好
  • 您是否有权批准修改?
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2016-05-09
  • 1970-01-01
相关资源
最近更新 更多