跳转到主要内容

未提供项目描述

项目描述

https://travis-ci.org/genericclient/genericclient-aiohttp.svg?branch=master https://coveralls.io/repos/github/genericclient/genericclient-aiohttp/badge.svg?branch=master

基于aiohttp的RESTful API通用客户端。仅支持Python 3.5及以上。

安装

$ pip install genericclient-aiohttp

快速入门

import asyncio

from genericclient_aiohttp import GenericClient

async def main():
    myclient = GenericClient(api_url)

    myresource = await myclient.resources.get(id=1)

    actives = await myclient.posts.filter(active=True)

    # or you can make multiple HTTP sharing the same session
    async with myclient as session:
        myresource = await session.resources.get(id=1)
        actives = await session.posts.filter(active=True)


loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))

用法

实例化

myclient = GenericClient(url, auth=None, session=None, trailing_slash=False, retries=3, autopaginate=None)

参数

  • url:您的API的根URL

  • auth:您的API的认证。您可以传递任何aiohttp.ClientSession可以接受的认证。

  • session:传递一个会话实例,以便aiohttp使用该会话。如果为None(默认),它将为您实例化一个aiohttp.ClientSession实例。

  • trailing_slash:如果您的API的URL以/结尾,您可以将其设置为True

  • retries:客户端在发生ClientConnectionError后应该重试http调用的次数

  • autopaginate:您可以将此设置为协程以获取请求产生的所有页面。目前,唯一的协程是genericclient_aiohttp.pagination.link_header,它支持[RFC5988](https://tools.ietf.org/html/rfc5988).

端点

端点作为主实例的属性或项目可用

await myclient.posts.all()  # GET /posts/
await myclient["active-users"].all()  # GET /active-users/

.all()

检索所有资源(实质上是端点的简单GET操作)

await myclient.posts.all()  # GET /posts/

.filter()

.filter(**kwargs)调用带有kwargs作为查询字符串值的GET

await myclient.posts.filter(blog=12, status=1)  # GET /posts/?blog=12&status=1

.get(**kwargs)

.filter()的一个特例。

如果 kwargs 包含 idpkslugusername,则按此顺序在 URL 路径中使用该值。

否则,将以 kwargs 作为查询字符串值调用 GET

如果返回的列表为空,将引发 ResourceNotFound 异常。

如果返回的列表包含多个资源,将引发 MultipleResourcesFound 异常。

注意,.get() 将返回一个 Resource,而不是 Resource 列表。

await myclient.posts.filter(blog=12, status=1)  # GET /posts/?blog=12&status=1
await myclient.posts.filter(id=12)  # GET /posts/12/
await myclient.posts.filter(slug='12-ways-clickbait')  # GET /posts/12-ways-clickbait/

.create(payload)

将产生一个 POST 请求,其中 payload(一个 dict)作为请求体,返回一个新的 Resource

post = await myclient.posts.create({'blog': 12, 'status': 1})  # POST /posts/

.get_or_create(defaults, **kwargs)

发出一个 GET 请求以获取资源。如果找不到资源,则发出一个 POST 请求来创建资源。

# Assuming it doesn't exist
post = await myclient.posts.get_or_update(slug='my-post', defaults={'status': 1})  # GET /posts/my-post/, then POST /posts/

.create_or_update(payload)

如果 payload 包含名为 'id' 的键,将发出一个 PUT 请求。如果服务器返回 400 错误,则将重新发出 PATCH 请求。如果 payload 不包含 'id',则将发出一个 POST 请求。

post = await myclient.posts.create_or_update({'status': 1})  # POST /posts/
post = await myclient.posts.create_or_update({'id': 1234, 'status': 1})  # PUT /posts/1234/

post = await myclient.posts.create_or_update({'id': 1234})  # PUT /posts/1234/
# <- server returns 400
# -> PATCH /posts/1234/

.delete(pk)

将发出一个 DELETE 请求,并使用 pk 作为 URL 的一部分。

await myclient.posts.delete(24)  # DELETE /posts/24/

资源

所有端点方法(除 .delete() 外)都返回一个 Resource 或一个 Resource 列表。

Resource 仅是一个封装 dict 的类,其中键可以作为属性访问。

此外,Resource 还有一个名为 .payload 的特殊属性,它包含从服务器接收到的原始请求数据。

Resource 具有以下方法

Resource.delete() 将产生一个 DELETE 请求,其中 Resource.id 作为 URL 的一部分。

blog = await myclient.posts.create({'blog': 12, 'status': 1})  # POST /posts/
await blog.delete()  # DELETE /blog/345/ -- the ID 345 was returned by the server in the previous response

Resource.save() 将产生一个 PUT 请求,其中 Resource.id 作为 URL 的一部分。如果服务器返回 400 错误,则将重新发出 PATCH 请求。

post = await myclient.posts.create({'blog': 12, 'status': 1})  # POST /posts/
post.status = 2
await post.save()  # PUT /posts/345/

post = Resource(id=345, status=1)
await post.save()  # PUT /posts/345/
# <- server returns 400
# -> PATCH /posts/345/

资源集

每当一个方法返回资源列表时,该列表将封装在一个 ResultSet 中。

ResultSet 仅是一个带有包含从服务器接收到的原始响应的 .response 属性的 list 对象。

自定义端点和资源

可以通过继承 genericclient_aiohttp.Resource 来自定义资源。

最常见的理由是指定主键的名称。

from genericclient_aiohttp import Resource


class PostResource(Resource):
    pk_name = 'slug'

可以通过继承 genericclient_aiohttp.Endpoint 来自定义端点。

form genericclient_aiohttp import Endpoint


class PostEndpoint(Endpoint):
    resource_class = PostResource

然后,您可以继承 genericclient_aiohttp.GenericClient 来告诉客户端在各个端点使用哪些端点类。

from genericclient_aiohttp import GenericClient

class Client(GenericClient):
    endpoint_classes = {
        'posts': PostEndpoint,
    }

路由

如果您的 API 在主要端点中有一些非 RESTful 调用(有时称为 detail_routelist_route),您可以使用 genericclient 来调用它们。

await myclient.posts(id=123).publish(date=tomorrow)
await myclient.blogs().ping()

HTTP 路由调用默认使用 POST,但您可以使用 _method 参数指定其他方法。

await myclient.posts(_method='get', id=123).pingbacks()
await myclient.blogs(_method='get').visits()

请注意,这些调用将返回 genericclient.ParsedResponse 实例,而不是 genericclient.Resource 实例。

许可证

在 MIT 许可证下授权。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

genericclient-aiohttp-1.4.2.tar.gz (10.7 kB 查看哈希值)

上传时间 源代码

构建分发

genericclient_aiohttp-1.4.2-py2.py3-none-any.whl (12.9 kB 查看哈希值)

上传时间 Python 2 Python 3

由...