gpt4 book ai didi

python - 在 Python 中使用 requests.Session() 作为上下文管理器来处理可变数量的连续请求

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:42 25 4
gpt4 key购买 nike

我想使用一个对象作为上下文管理器,但控制调用 __exit__ 方法的时刻。

特别是,我正在使用 Python requests 模块提供的 Session() 对象,它可以用作上下文管理器。我明白,只需使用例如requests.get() 每次都会创建和销毁一个新的 Session() 对象,而持久化 session 应该提供更短的响应时间并为所有对象保留 header 等 session 内的请求。我想使用 Session() 发出 x 请求,然后关闭 session 并使用新的 Session( ) 对象,依此类推,直到我的代码运行完毕。但是,由于我在代码中对 Session().get() 进行了各种调用,因此我不希望将其全部包含在 with block 中。我有什么选择?

对于更有经验的 Python 程序员来说,这可能是一个简单的问题,但我发现自己陷入了如何组织代码的困境中。关于如何实现这一点有什么想法吗?如果需要,很乐意提供任何说明。谢谢。

最佳答案

请注意,调用 Session() 始终会创建一个新的 Python 对象,此处为 requests session 。这意味着如果你有,正如你所说

various calls to Session().get() in my code

那么你每次都必须创建一个新的 Session 对象。没有办法用一些魔法来包装你的代码以重用同一个 session 。您有两个主要解决方案。

1。创建一个 session 对象并重用它。

因为您的代码可能看起来像这样(其中创建了三个独立的 session ):

Session().get(...)
# ...
Session().get(...)
# ...
Session().get(...)

相反,创建一个 session ,每次都重复使用它。您需要这样修改您的代码:

mysession = Session() # create a new session

mysession.get(...)
# ...
mysession.get(...) # session is reused
# ...
mysession.get(...) # session is reused

# finished with session, make sure to close it!
mysession.close()

这可以避免将所有内容放入 with block 中。

2。将代码放在 with block 中。

with requests.Session() as s:
s.get(...)
s.get(...)
s.get(...)
# session s automatically closed here

documentation 中所述,with 上下文管理器

will make sure the session is closed as soon as the with block is exited, even if unhandled exceptions occurred.

这是主要的好处 - 您不必记住关闭 session ,这很容易忘记,特别是当您发出大量请求时。

您注意到您不希望将所有 session 调用都包含在 with block 中。一项建议是在 with block 中处理所有请求,然后在 block 外处理生成的响应。这将 a) 将您的代码分为“获取远程数据”和“处理远程数据”部分,使其更易于阅读,但是,如果不查看您的代码/逻辑,这可能是不可能的。

关于python - 在 Python 中使用 requests.Session() 作为上下文管理器来处理可变数量的连续请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46887162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com