Operazioni asincrone

Come visto precedentemente, la classe Client già supporta l’esecuzione asincrona di gran parte dei suoi metodi, tramite l’uso delle callback success, error e progress. Esiste però anche un approccio più moderno all’esecuzione asincrona che supporta direttamente il modulo asyncio di Python, in modo da poter usare costrutti come async e await; per fare questo è stata introdotta la classe AsyncClient.

Nota

La classe AsyncClient è disponibile solo se si usa Python versione 3.6 o successive.

E” possibile convertire oggetti di classe Client a oggetti di classe AsyncClient e viceversa tramite i metodi kongalib.Client.as_async() e kongalib.AsyncClient.as_sync(); eventuali connessioni a server e database verranno preservate.

Classe AsyncClient

Esempi

Di seguito vengono riportati alcuni esempi di utilizzo della classe AsyncClient; si assume che ci sia un server Konga disponibile su localhost e che esista su di esso un database SQLite «demo» inizializzato con i dati di esempio.

Esempio di connessione e lista dell’archivio clienti presenti sul database:

import asyncio
import kongalib

async def main():
        c = kongalib.AsyncClient()
        await c.connect(host='localhost')
        await c.open_database('sqlite', 'demo')
        await c.authenticate('admin', '')
        results = await c.select_data('EB_ClientiFornitori', ['Codice', 'RagioneSociale'], 'Tipo = 1')
        for row in results:
                print(row)

asyncio.run(main())

Esempio di come ottenere tutto il record di un documento fiscale (testata e righe):

import asyncio
import kongalib

def print_data(data, indent=1):
        # Stampa i dati, tralasciando le chiavi speciali (che cominciano con '@')
        lines = [ '%s: %s' % (key, value) for key, value in data.items() if not key.startswith('@') ]
        print("\n".join((indent * "\t") + line for line in lines))

async def main():
        c = kongalib.Client()
        await c.connect(host='localhost')
        await c.open_database('sqlite', 'demo')
        await c.authenticate('admin', '')
        record = await c.get_record('EB_DocumentiFiscali', 11, code_azienda='00000001')
        print("Testata:")
        print_data(record)
        rows = record.get('@rows', [])
        for i, row in enumerate(rows):
                print("\tRiga %d:" % (i + 1))
                print_data(row, 2)

asyncio.run(main())