设置boto3 dynamodb endpoint_url globaly

时间:2018-04-21 12:46:30

标签: boto3

我想使用dynamodb local进行基于python / boto3的应用程序的本地(单元)测试。

现在我可以做这样的事情

if test_mode:
    client = boto3.client("dynamodb", endpoint_url="localhost:8000")
    resource = boto3.resource("dynamodb", endpoint_url="localhost:8000")
else:
    client = boto3.client("dynamodb")
    resource = boto3.resource("dynamodb")

但我想避免test_mode检查。

我可以以某种方式"准备" boto3所以dynamodb端点URL是全局设置的吗?

更新

进一步解释我想要什么。我想要某种功能,我可以说:

boto3.setGlobalDynamodbEndpoint("http://localhost:8000")

这样,在调用此函数后,我会这样做:

client = boto3.client("dynamodb")
resource = boto3.resource("dynamodb")

端点将自动设置为"http://localhost:8000"

2 个答案:

答案 0 :(得分:0)

据我所知,boto3库中没有内置函数可以为您完成此操作,但是您可以使用Python标准库中的functools.partial utility获得类似的结果。该工具接受一个Python callable和一个或多个参数,然后返回一个执行相同操作的新可调用对象,但这些参数为“预设”。在函数式编程术语中,这称为"partially applying"一个函数(因此名为partial)。

例如,

import functools
import boto3

URL = "http://localhost:8000"
boto3.client = functools.partial(botot3.client, endpoint_url=URL)
boto3.resource = functools.partial(boto3.resource, endpoint_url=URL)

通过将boto3.clientboto3.resource重新定义为我们的新部分,而不是库中的原始版本,我们就是monkey-patching boto3

稍后在您的代码中调用:

client = boto3.client("dynamodb")
resource = boto3.resource("dynamodb")

您无需显式传递endpoint_url,因为客户端和资源对象将使用partial对象中先前设置的URL值自动实例化。

答案 1 :(得分:0)

我刚刚向 boto3 项目提交了一个 PR,以使用 env var 来覆盖 endpoint_url,这可能对此有用。

https://github.com/boto/boto3/pull/2746

https://github.com/rwillmer/boto3