iMetos FieldClimate API的客户端。
项目描述
python-fieldclimate
A client for the iMetos FieldClimate API: https://api.fieldclimate.com/v1/docs/
To use this, you’ll need HMAC credentials provided by iMetos. See their docs for more info.
Requires Python 3.5 or better. Tested on Python 3.6. Depends on asks and pycryptodome.
安装
使用pip从PyPI安装当前版本,版本1.3
pip install python-fieldclimate
用法
以下是一个简单的示例,它返回关联用户的账户信息
from asyncio import run
from fieldclimate import FieldClimateClient
async def main():
async with FieldClimateClient(private_key="YOUR", public_key="KEYS") as client:
return await client.get_user()
if __name__ == "__main__":
run(main)
事件循环
New in version 1.3.
The same FieldClimateClient class can be used to make asynchronous API requests under any modern event loop. This is thanks to asks being written with anyio, which currently supports asyncio, curio, and trio.
认证
HMAC凭证可以通过几种方式提供
通过init构造函数
>>> FieldClimateClient(public_key="YOUR", private_key="KEYS")
环境变量FIELDCLIMATE_PUBLIC_KEY和FIELDCLIMATE_PRIVATE_KEY。
FieldClimateClient子类化
>>> class MyClient(FieldClimateClient): ... private_key = "YOUR" ... public_key = "KEYS"
如果您使用Django,可以使用fieldclimate.django.DjangoFieldClimateClient来代替FieldClimateClient。这个子类将从Django的设置中获取FIELDCLIMATE_PUBLIC_KEY和FIELDCLIMATE_PRIVATE_KEY。
方法
客户端为API文档中列出的每个对应路由都提供了方法。方法很多,因此请参阅fieldclimate/__init__.py中的完整方法列表以获取更多详细信息。每个方法在被等待时都会返回一个类似JSON的Python对象,如字典或列表。
一些方法会清理它们的参数,以便在Python中更容易地使用API。以下是一些示例
get_data_last()接受time_period参数。API文档指定这应该是一个类似于'6h'或'7d'的字符串,表示6小时或7天。FieldClimateClient还接受timedelta对象作为此参数,并将它们转换为API的等效字符串(即timedelta(hours=6)转换为'21600'秒)。
许多方法需要station参数,如上面示例中的get_data_range()所示。这可以是一个原始的Station ID字符串,您可以从get_user_stations()返回的station字典中挖掘出来。或者,您可以直接将那个字典作为station参数传递,并将ID提取出来。
这些方法并不都有测试覆盖率(测试delete_user()可能是个坏主意)。然而,它们使用的底层连接和清理实用工具都已进行了测试。
连接限制
New in version 1.3.
可以通过在调用FieldClimateClient构造函数时设置connections参数来提高连接限制。
请参阅asks的文档
您必须将连接数更改为适合您的需求和服务器限制的值。如果没有公开的数据可以指导您,请保守一些。
会话池中的默认连接数仅为可怜的1个。
示例
async with FieldClimateClient(connections=10) as client:
...
根据FieldClimate的文档,他们尚未在服务器端实施速率限制。使用具有高连接限制的FieldClimateClient可以一次创建许多请求。在我的测试中,我发现API开始抛出502错误,当我过度负载它时。
请礼貌地使用您的资源消耗!
高级示例
此函数请求一些用户数据并获取所有用户站点的列表,同时进行。一旦站点返回,它就会计算它们的数量并发送针对前10个站点的另一个请求。然后,按服务器响应时间排序打印这10个站点的每个响应。
from asyncio import gather, run
from fieldclimate import FieldClimateClient
async def main():
async with FieldClimateClient(
private_key="YOUR",
public_key="KEYS",
connections=20
) as client:
async def print_user_json():
print(await client.get_user())
async def print_station_dates(station):
print(await client.get_data_range(station))
async def count_stations_then_print_ranges():
stations = await client.get_user_stations()
print(len(stations))
await gather(*[
print_station_dates(station)
for station in stations[:10]
])
await gather(
print_user_json(),
count_stations_then_print_ranges(),
)
if __name__ == "__main__":
run(main())
如果要在curio和trio事件循环中使用FieldClimateClient,请查看tests目录中的替代实现(方法几乎相同)。
同步使用
已从版本1.3中删除。
在版本1.2中,FieldClimateClient会在调用方法时自动设置asyncio事件循环(当方法被调用在async with块之外时)。这样,调用者可以在不编写任何令人害怕的async/await代码的情况下使用库。
这种语法的混合使用变得令人困惑且不必要,同时还导致了这里的代码混乱。因此,随着转向asks后端,对旧同步用例的支持已删除。
如果您使用的是FieldClimateClient的较旧的“同步使用”模式,那么您已经使用了允许async/await的Python版本。区别在于现在您必须自己设置事件循环。
如果你仍然真的不想编写任何协程,让你的代码与1.3版本兼容的最简单方法就是将每个方法调用包裹在asyncio.run()中。
import asyncio
from fieldclimate import FieldClimateClient
def main():
client = FieldClimateClient(private_key="YOUR", public_key="KEYS")
# print user json
print(asyncio.run(client.get_user()))
# count stations
stations = asyncio.run(client.get_user_stations())
print(len(stations))
# print ranges
for station in stations[:10]:
print(asyncio.run(client.get_data_range(station)))
if __name__ == "__main__":
main()
这个“同步”示例的完成时间比上面的“高级示例”多3倍,因为每次向服务器发送请求时,主()函数都会被阻塞。另一方面,异步代码只有在没有其他事情可做时才会阻塞,只能等待服务器。在决定是否将你的代码转换为使用协程函数时,请考虑这一点。
贡献
欢迎提交拉取请求。请使用black清理代码,编写测试,并编写文档。
PR想法
通过详尽的模拟实现完全的方法测试覆盖率。
OAuth 2.0认证。
变更
待办事项
添加对Metos API v2的支持:https://api.fieldclimate.com/v2/docs/ - 我们如何最好地同时支持v2和v1用户,后者仍然需要支持? - 在决定如何解决这个问题之前,需要评估新API与旧API的不同之处。 - 增加主要版本号以跟踪上游。
1.3 (2019-09-23)
高级变更
为了使用asks,放弃了使用aiohttp库。
这增加了对asyncio、trio和curio异步循环的支持。
在FieldClimateClient中放弃了同步接口。这意味着现在所有客户端方法都必须等待。
实现变更
将url验证函数从fieldclimate.utils移动到fieldclimate.clean。这些函数现在明确地引发AssertionError,因为断言可以关闭。
FieldClimateClient现在从asks.Session继承,它提供了异步上下文管理器和连接速率限制。
移除了BaseClient和HmacClient类,将它们的功能统一到FieldClimateClient中。
增加了对trio和curio事件循环的测试。
额外变更
添加了DjangoFieldClimateClient。这个子类从django的设置中获取HMAC认证密钥,如果你已经使用django,这可以节省你几行代码。
1.2 (2018-10-26)
为了同步和异步接口,放弃了使用requests库,转而使用aiohttp。
1.1 (2018-10-25)
将所有station_id方法参数重命名为station,这可能会破坏你的代码。
这个参数现在可以处理整个站点的字典,并且会自动提取station_id。
1.0 (2018-10-24)
PyPI初始版本发布。🎉
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。