一个小型REST客户端,为您的设备充电
项目描述
PowerNap
一个小型REST客户端,为您的设备充电
PowerNap是一个简单的JSON REST API客户端,是httpx的小型包装器,可以让您的代码读起来更好。
安装
$ pip install powernap
用法
# You will need an httpx Client. Let's do a GitHub client!
httpx_client = httpx.Client(
    base_url="https://api.github.com/v3",
    headers={"Authorization": f"token {token}"}
)
# Instantiate the PowerNap client
github_client = powernap.PowerNap(httpx_client=httpx_client)
# PowerNap will help you build complex URLs in a pythonic-looking way:
repo = github_client.repos("ewjoachim/powernap").get()
# And access the json responses like objects
count_stars = repo.stargazers_count
# You can also easily send POST requests.
github_client.repos("ewjoachim/powernap").issues(42).comments.post(
    body=f"Wow look! This repo has {count_stars} stars!"
)
构建复杂URL
您可以使用client(something)或client.something,并进行链式调用。在形式client(something)中,您可以传递多个参数,它们将被连接在一起
# The next calls are all identical and target:
#    {base_url}/repos/ewjoachim/powernap/stargazers
github_client.repos("ewjoachim/powernap").stargazers.get()
github_client.repos("ewjoachim").powernap("stargazers").get()
github_client.repos("ewjoachim", "powernap", "stargazers").get()
github_client.repos("ewjoachim", "powernap")("stargazers").get()
github_client("repos/ewjoachim/powernap/stargazers").get()
# The recommended way is to use client.something for static parts of the url and
# client(something) with a variable for dynamic parts.
# You can also target the base url directly
# {base_url}
github_client().get()
像对象一样访问json响应
在json响应中,所有对象(包括嵌套的)都配置为可以使用object.key语法获取键,除了经典的object["key"]。
# GET /nested_json -> {"a": {"b":{"c": "d"}}}
response = some_api_client.nested_json.get()
assert response == {"a": {"b":{"c": "d"}}}
assert response["a"]["b"]["c"] == "d"
# But also the magic form:
assert response.a.b.c == "d"
参数
在.get/delete()调用中的参数用作调用中的查询参数。
在.post/put/patch()调用中的参数组合在一起,并作为调用中的JSON有效负载传递。
响应类型
如果响应包含Content-Type: application/json,则您将获得上面描述的“魔法”json响应。否则,如果内容类型是text/*,您将获得一个string,否则您将获得bytes。
异常
如果您想避免 httpx 异常到达您的代码,以保持良好的抽象层,那么您可能想继承 Powernap 并实现 handle_exception(self, exc)。您将收到一个 httpx.HttpError,您需要根据情况抛出相应的异常。在这种情况下不抛出异常被视为错误。
from typing import NoReturn
class ApiError(MyProjectError):
    pass
class ForbiddenError(ApiError):
    pass
class ApiClient(PowerNap):
    def handle_exception(self, exc: httpx.HttpError) -> NoReturn:
        if exc.response.status_code == 403:
            raise ForbiddenError
        raise ApiError
更多对输入和输出的控制
这个魔法很棒,但有时您可能想要更多的控制。如果您想发送额外的头信息或非 JSON-dict 负载,或者如果您想读取响应头信息,这也是可能的。
不要调用 .get(),而是使用 .get.i()、.get.o() 或 .get.io()(这适用于任何方法:get/post/put/patch/delete)
- 如果您使用 .get.i(...)(或.get.io(...)),您将控制输入。方法关键字参数将原样传递给底层的httpx.Client().get(...)。
- 如果您使用 .get.o(...)(或.get.io(...)),您将得到原始输出。函数将返回一个httpx.Response对象。(注意,在这种情况下,我们仍然调用了.raise_for_status())
如果您经常使用 get.io(),那么 PowerNap 可能不是您需要的项目。直接使用 httpx.Client,构建一些帮助您构建 URL 的东西(您可以 偷取 复制相关的代码,别忘了复制许可证)
名称
在寻找这个库的名称时,我查阅了“小休息”的所有同义词。令人惊讶的是,有许多其他项目走了相同的路线。以下是一些例子:
- nap看起来很棒!虽然这个库与这个库无关,但目标相同。看起来没有维护,但我不确定这样的库是否需要大量的维护。
- catnap
- respite
- snooze没有被占用,但- snooze-server已经被占用,我不想造成混淆。
有趣的是,许多这些项目都有与这个项目相同的目标,但它们的视觉效果与我想达到的并不完全一致。
致谢
这个库深受 githubpy 启发,后者采用 Apache 许可证。
- 用于启发的版本
- 作者:李晓峰(《askxuefeng@gmail.com》)
- 原始许可证
项目详情
下载文件
为您的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源代码分发
构建分发
powernap-1.0.1.tar.gz 的哈希
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 07ce556fe332fcaa14bb22a52942b464a070605925678772b18f253d8241dc2d | |
| MD5 | ce0d35be953b4cbcdde76756e3ba9421 | |
| BLAKE2b-256 | 0ed7323a44664964a42413fb54a85b08c3ed1641f71bb91a2111586159fab012 | 
powernap-1.0.1-py3-none-any.whl的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 1357c1c4bcc1ed5dd3279f23b8d8c6d75ebf0e5d9c1e755426bcd7b3ac694aeb | |
| MD5 | 353a641fdb7f32dd951e48a33e586f15 | |
| BLAKE2b-256 | f3672a1d635c10f9345a4b9bc16368a37e34316cacc13c9fe7f454d00771e64a |