Skip to main content

Server Usage

import asyncio
import peewee_async
import peewee_asyncext
import peewee
import aiodata.server as aiodata
import aiohttp.web
import functools

# get event loop
loop = asyncio.get_event_loop()

# create an asyncio-compatible peewee database
database = peewee_asyncext.PostgresqlExtDatabase('test')

# used for async query executions
objects = peewee_async.Manager(database)

# build a model
class Users(peewee.Model):

  name = peewee.TextField(null = True)

  tag = peewee.IntegerField(null = True)

  hobby = peewee.TextField(null = True)

  class Meta:

    database = database

    primary_key = peewee.CompositeKey('name', 'tag')

# ensure it exists
Users.create_table()
# ...do other stuff

# will create a function checking the 'Authorization'
# header of each request for this token and validating;
# raises an aiohttp.web.HTTPUnauthorized error upon failure
authorize = aiodata.utils.authorizer('super secret')

# heartbeat
interval = 30

# create the client;
# for no auth, simply pass `lambda request: None`
client = aiodata.Client(authorize, interval)

# utils.fail is a convenience function for error raising with json data;
# this is the error handlers will raise for bad requests, passing an
# arbitrary amount of positional arguments, starting with a code (str)
# representing the error, ex: error('database error', output)
fail = functools.partial(aiodata.utils.fail, aiohttp.web.HTTPBadRequest)

# make the application
app = aiohttp.web.Application()

# will create handlers and then dispatchers for the client;
# also saves information related to the smooth execution of
# websocket connections utilized by the peers - important!
# yields route assets in the form of (method, path, handler)
routes = aiodata.utils.setup(client, objects, Users, authorize, fail)

# iterate through
for route in routes:

  # and add them to our router
  app.router.add_route(*route)

# also add some route for the websocket connection
app.router.add_route('GET', '/state', client.connect)

# disable sync
database.set_allow_sync(False)

# run the app localy
aiohttp.web.run_app(app)

Requests should be in the form of METHOD */model with json [keys, data].

import requests

url = 'http://localhost:8080/users'

keys = ['cat', 40]

data = {'hobby': 'meowing'}

body = [keys, data]

headers = {'Authorization': 'super secret'}

response = requests.post(url, json = body, headers = headers)

# will be an array of dicts as rows with all their columns;
# every successful request returns all the rows affected
entries = response.json()

print(entries)

Client Usage

import asyncio
import aiohttp
import aiodata.client as aiodata

# get event loop
loop = asyncio.get_event_loop()

# create the session
session = aiohttp.ClientSession(loop = loop)

# beep boop
host = 'http://localhost:8080'

# create a function injecting the headers
# with an 'Authorization' key against this token
authorize = aiodata.utils.authorizer('super secret')

# create the client;
# for no auth, simply pass `lambda kwargs: None`
client = aiodata.Client(session, host, authorize)

# listen for rows being updated
@client.track('update', 'users')
async def listener(entries):

  for before, after in entries:

    for key, value in before.items():

      check = after[key]

      if value == check:

        continue

      print('changed', key, 'from', value, 'to', check)

# demonstration
async def execute():

  # will connect to websocket,
  # receive info, build, fill cache,
  # listen for database interactions
  await client.start('/state')

  # cache can be poked like so;
  # entries are simple objects,
  # tables are overwritten dicts
  entry = client.cache.users.get('cat', 40)

  # see before
  print(entry.hobby)

  # change the tag (primary) and hobby
  # make a request, patching all rows with 'cat' as name;
  # the positional nature of the keys implies entries
  # can't be bulk edited by leading primary keys alone
  entries = await client.update('cat', tag = 80, hobby = 'barking')

  print(entries)

  await client.close()

  await session.close()

coroutine = execute()

loop.run_until_complete(coroutine)

Installing

python3 -m pip install aiodata

Download files

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

Source Distribution

aiodata-1.3.4.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

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

aiodata-1.3.4-py3-none-any.whl (13.9 kB view details)

Uploaded Python 3

File details

Details for the file aiodata-1.3.4.tar.gz.

File metadata

  • Download URL: aiodata-1.3.4.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.20.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.3

File hashes

Hashes for aiodata-1.3.4.tar.gz
Algorithm Hash digest
SHA256 8340b4d3e0d1e88e69ca5fa58c560876fb765c56b3665d9bd605b797fcb421fa
MD5 ffd4eb5846adb25ec971a97539ab9e88
BLAKE2b-256 ee0a925d70b3523c73d00cd6e0dd8fd34365fe1d7d6aeafe4f1099c6943e45cb

See more details on using hashes here.

File details

Details for the file aiodata-1.3.4-py3-none-any.whl.

File metadata

  • Download URL: aiodata-1.3.4-py3-none-any.whl
  • Upload date:
  • Size: 13.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.20.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.3

File hashes

Hashes for aiodata-1.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 dd7bbe865831daac62eb417b843e3e6c24db70138b0b06bad1e435b9299ab0a8
MD5 8f464509b7f29ce791db31fa58312433
BLAKE2b-256 1ddf7b1b7fa684f369148a57e978e73a7acbe0b2aa640bfb444bb2ab59c3109e

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