【问题标题】:Consolidating redundant parameters in requests合并请求中的冗余参数
【发布时间】:2019-01-12 21:53:42
【问题描述】:

我在我的代码中使用 requests 模块(显然是为了执行请求),由于我需要为每个请求包含冗余参数,我的代码很快就会失控:

def one(url, data, headers, cert):
    ...
    return requests.post(url, json=data, headers=headers, verify=cert)

def two(otherurl, otherheaders, cert):
    ...
    response = requests.get(otherurl, headers=otherheaders, verify=cert).json()

有没有办法告诉每个请求使用verify=cert 而不必在每个请求语句中包含它?我在想session() 应该能够做到这一点,虽然我不知道如何使用它。我只是想尽量减少可能在我的脚本中全局设置的事情的重复。也许这是不可能的,或者它实际上是如何工作的?提前致谢。

【问题讨论】:

    标签: python request arguments parameter-passing


    【解决方案1】:

    您可以使用functools.partial 覆盖这些函数,默认情况下将verify=cert 作为参数传递:

    from functools import partial
    requests.post = partial(requests.post, verify=cert)
    requests.get = partial(requests.get, verify=cert)
    

    或者如果您查看requests 的源代码,您会发现这两个函数都只是requests.request 函数的包装器,而后者又是requests.Session.request 方法的包装器。因此,您可以覆盖requests.Session.request,而不是用一条语句覆盖所有 HTTP 方法。但是,由于它是一种方法而不是未绑定的函数,因此您必须改用 functools.partialmethod

    from functools import partialmethod
    requests.Session.request = partialmethod(requests.Session.request, verify=cert)
    

    【讨论】:

    • 嗨,在第二个例子中,我得到TypeError: request() missing 1 required positional argument: 'self'。我可能做错了什么 - 第一个例子工作正常 - 谢谢!
    • 您可能想更新问题,说明您如何在代码中使用partial,以便我或其他人可以提供更好的帮助。
    • 我不太清楚你的意思,我是在你提到之后才开始使用的。
    • 我的意思是,您可以在代码中发布您如何使用它,以便我们有更好的上下文。
    • 我继续发布了代码here的工作示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多