asyncio wrapper for burnash's Google Spreadsheet API library, gspread
Project description
gspread_asyncio
An asyncio wrapper for burnash's excellent Google Spreadsheet API library. gspread_asyncio
isn't just a plain asyncio wrapper around the gspread
API, it implements several useful and helpful features on top of those APIs. It's useful for long-running processes and one-off scripts.
Requires Python >= 3.5 because of its use of async/await syntax.
Features
- Complete async wrapping of the
gspread
API. Allgspread
API calls are run off the main thread in a threadpool executor. - Internal caching and reuse of
gspread
Client
/Spreadsheet
/Worksheet
objects. - Automatic renewal of expired credentials.
- Automatic retries of spurious failures from Google's servers (HTTP 5xx).
- Automatic rate limiting with defaults set to Google's default API limits.
- Many methods that don't need to return a value can optionally return an already-scheduled
Future
(thenowait
kwarg). You can ignore that future, allowing forward progress on your calling coroutine while the asyncio event loop schedules and runs the Google Spreadsheet API call at a later time for you.
Example usage
import asyncio
import gspread_asyncio
from oauth2client.service_account import ServiceAccountCredentials
async def run(agcm):
agc = await agcm.authorize()
ss = await agc.create('Test Spreadsheet')
print('Spreadsheet URL: https://docs.google.com/spreadsheets/d/{0}'.format(ss.id))
await agc.insert_permission(ss.id, None, perm_type='anyone', role='writer')
ws = await ss.add_worksheet('My Test Worksheet', 10, 5)
zero_ws = await ss.get_worksheet(0)
for row in range(1,11):
for col in range(1,6):
val = '{0}/{1}'.format(row, col)
await ws.update_cell(row, col, val+" ws")
await zero_ws.update_cell(row, col, val+" zero ws")
await asyncio.sleep(30)
agcm.loop.stop()
def get_creds():
return ServiceAccountCredentials.from_json_keyfile_name('serviceacct_spreadsheet.json',
['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/spreadsheets'])
agcm = gspread_asyncio.AsyncioGspreadClientManager(get_creds)
loop = asyncio.get_event_loop()
loop.set_debug(True)
loop.create_task(run(agcm))
loop.run_forever()
Observational notes and gotchas
- This module does not define its own exceptions, it propagates instances of
gspread.exceptions.GSpreadException
. - Always call
AsyncioGspreadClientManager.authorize()
,AsyncioGspreadClient.open_*()
andAsyncioGspreadSpreadsheet.get_worksheet()
before doing any work on a spreadsheet. These methods keep an internal cache so it is painless to call them many times, even inside of a loop. This makes sure you always have a valid set of authentication credentials from Google. - The only object you should store in your application is the
AsyncioGspreadClientManager
(agcm
). - There is a bug in the underlying gspread library where the
Spreadsheet.title
property does I/O. I think this should be fixed at the gspread layer, but until then you may have issues from failed API calls when accessing the.title
property. - Right now the
gspread
library does not support bulk appends of rows or bulk changes of cells. When this is donegspread_asyncio
will support batching of these Google API calls without any changes to the Pythongspread_asyncio
API. - I came up with the default 1.1 second delay between API calls (the
gspread_delay
kwarg) after extensive experimentation. The official API rate limit is one call every second but however Google measures these things introduces a tiny bit of jitter that will get you rate blocked if you ride that limit exactly. - Google's service reliability on these endpoints is surprisingly bad. There are frequent HTTP 500s and the retry logic will save your butt in long-running scripts or short, one-shot, one-off ones.
- Experimentation also found that Google's credentials expire after an hour and the default
reauth_interval
of 45 minutes takes care of that just fine.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
gspread_asyncio-1.0.0.tar.gz
(13.1 kB
view details)
Built Distribution
File details
Details for the file gspread_asyncio-1.0.0.tar.gz
.
File metadata
- Download URL: gspread_asyncio-1.0.0.tar.gz
- Upload date:
- Size: 13.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f927bcf808128439e70f06d6b422f861516125fa57c25c7181c725ff5fbf74aa |
|
MD5 | 8512abf6b5dfb40d5dbdda9ee5414fb7 |
|
BLAKE2b-256 | 48d372758293c45efdc0d96d363d4b3b3fce4466f8fd1fe8cd867e7fa29161b7 |
File details
Details for the file gspread_asyncio-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: gspread_asyncio-1.0.0-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d7d58bbab3163acff26c41e4359b67f70aeef748ab1b83d1a7f15713e9b8f46d |
|
MD5 | 4fd06d2a5e0522ad5718eed59eda8cc0 |
|
BLAKE2b-256 | b6e8cea0203eaeeed6b7557b63d1ef10f4d2c346cc0b4bc70343f0aff1781a08 |