未提供项目描述
项目描述
基于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 包含 id、pk、slug 或 username,则按此顺序在 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_route 和 list_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 许可证下授权。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
哈希值 for genericclient_aiohttp-1.4.2-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d8997a022b16a87702b8aaf542962e8bc00721ee930ecb97557683660cb4aca7 |
|
MD5 | 3d58ed0bf833b579607bae8c53000c14 |
|
BLAKE2b-256 | d75691b9c887749e0da45c902f8dead0e72b33270ddfe6e7f80ffbd5915971b4 |