Skip to main content

No project description provided

Project description

https://travis-ci.org/genericclient/genericclient-aiohttp.svg?branch=master

A generic client for RESTful APIs based on aiohttp. Python 3.5+ only.

Installation

$ pip install genericclient-aiohttp

Quickstart

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)

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

Usage

Instantiation

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

Arguments:

  • url: The root URL of your API

  • auth: The auth for your API. You can pass anything that aiohttp.ClientSession can accept as auth.

  • session: Pass a session instance to have aiohttp use that session. If None (the default), it will instantiate an instance of aiohttp.ClientSession for you.

  • trailing_slash: You can set this to True if your API’s URLs end with a /

Endpoints

Endpoints are available as properties on the main instance.

.all()

Retrieves all resources (essentially a simple GET on the endpoint):

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

.filter()

.filter(**kwargs) calls a GET with kwargs as querystring values:

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

.get(**kwargs)

A special case of .filter().

If kwargs contains id, pk, slug or username, that value will be used in the URL path, in that order.

Otherwise, it calls a GET with kwargs as querystring values.

If the returned list is empty, will raise ResourceNotFound.

If the returned list contains more than 1 resource, will raise MultipleResourcesFound

Note that .get() will return a Resource, not a list of Resource s

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)

Will result in a POST, with payload (a dict) as the request’s body, returning a new Resource:

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

.get_or_create(defaults, **kwargs)

Issues a GET to fetch the resource. If the resource is not found, issues a POST to create the resource:

# 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)

If payload contains a key called 'id', will issue a PUT. If the server returns a 400 error, a PATCH request will be re-issued. If payload` does not contains 'id', it will issue a 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)

Will issue a DELETE, and will use pk as part of the URL:

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

Resources

All endpoints methods (with the exception of .delete()) return either a Resource or a list of Resource s.

A Resource is just a wrapping class for a dict, where keys can be accessed as properties.

Additionally, Resource s have a special property called .payload, which contains the original payload received from the server.

Resource s have the following methods:

Resource.delete() will result in a DELETE, with Resource.id as par of the 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() will result in a PUT, with Resource.id as par of the URL. If the server returns a 400 error, a PATCH request will be re-issued:

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/

Routes

If your API has some non-RESTful calls within the main endpoints (sometimes referred as detail_route and list_route), you can use genericclient to call them:

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

Routes http calls use POST by default, but you can specify something else by using the _method argument:

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

Note that instead of instances of genericclient_aiohttp.Resource, this calls will return an instance of aiohttp.web.Response.

License

Licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

genericclient-aiohttp-0.0.7.tar.gz (7.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

genericclient_aiohttp-0.0.7-py2.py3-none-any.whl (13.8 kB view details)

Uploaded Python 2Python 3

File details

Details for the file genericclient-aiohttp-0.0.7.tar.gz.

File metadata

File hashes

Hashes for genericclient-aiohttp-0.0.7.tar.gz
Algorithm Hash digest
SHA256 e8d09763db3a2e51b08bdf721f313b84f39739ae75cab3a806e01aaeab81be0d
MD5 799b42987b375ac65b53ff342331b0f3
BLAKE2b-256 c72fd606282b94bd1969a5d1caa685c9583ff32c3c9253e771c3ef0b0d9b67a6

See more details on using hashes here.

File details

Details for the file genericclient_aiohttp-0.0.7-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for genericclient_aiohttp-0.0.7-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 b6bf509b20fbea5a00d03ca2edc45a41ae96fda75714e0e7c646f8bf37da8c0e
MD5 16bf4bfd6fd3020bf7de31233295c604
BLAKE2b-256 aec9cc567946307b4480e611255caa8bf29b28fa123974d0ef4ab78e7e129356

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page