Allow easy switching between cached and uncached requests to Pillar
This commit is contained in:
parent
73e2fd77e2
commit
82c7560c7b
@ -18,7 +18,7 @@ from . import cache
|
|||||||
|
|
||||||
SUBCLIENT_ID = 'PILLAR'
|
SUBCLIENT_ID = 'PILLAR'
|
||||||
|
|
||||||
_pillar_api = None # will become a pillarsdk.Api object.
|
_pillar_api = {} # will become a mapping from bool (cached/non-cached) to pillarsdk.Api objects.
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
uncached_session = requests.session()
|
uncached_session = requests.session()
|
||||||
_testing_blender_id_profile = None # Just for testing, overrides what is returned by blender_id_profile.
|
_testing_blender_id_profile = None # Just for testing, overrides what is returned by blender_id_profile.
|
||||||
@ -124,14 +124,14 @@ def blender_id_subclient() -> dict:
|
|||||||
return subclient
|
return subclient
|
||||||
|
|
||||||
|
|
||||||
|
def pillar_api(pillar_endpoint: str = None, caching=True) -> pillarsdk.Api:
|
||||||
def pillar_api(pillar_endpoint: str = None) -> pillarsdk.Api:
|
|
||||||
"""Returns the Pillar SDK API object for the current user.
|
"""Returns the Pillar SDK API object for the current user.
|
||||||
|
|
||||||
The user must be logged in.
|
The user must be logged in.
|
||||||
|
|
||||||
:param pillar_endpoint: URL of the Pillar server, for testing purposes. If not specified,
|
:param pillar_endpoint: URL of the Pillar server, for testing purposes. If not specified,
|
||||||
it will use the addon preferences.
|
it will use the addon preferences.
|
||||||
|
:param caching: whether to return a caching or non-caching API
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global _pillar_api
|
global _pillar_api
|
||||||
@ -139,28 +139,38 @@ def pillar_api(pillar_endpoint: str = None) -> pillarsdk.Api:
|
|||||||
# Only return the Pillar API object if the user is still logged in.
|
# Only return the Pillar API object if the user is still logged in.
|
||||||
subclient = blender_id_subclient()
|
subclient = blender_id_subclient()
|
||||||
|
|
||||||
if _pillar_api is None:
|
if not _pillar_api:
|
||||||
# Allow overriding the endpoint before importing Blender-specific stuff.
|
# Allow overriding the endpoint before importing Blender-specific stuff.
|
||||||
if pillar_endpoint is None:
|
if pillar_endpoint is None:
|
||||||
from . import blender
|
from . import blender
|
||||||
pillar_endpoint = blender.preferences().pillar_server
|
pillar_endpoint = blender.preferences().pillar_server
|
||||||
|
|
||||||
pillarsdk.Api.requests_session = cache.requests_session()
|
_caching_api = pillarsdk.Api(endpoint=pillar_endpoint,
|
||||||
|
username=subclient['subclient_user_id'],
|
||||||
|
password=SUBCLIENT_ID,
|
||||||
|
token=subclient['token'])
|
||||||
|
_caching_api.requests_session = cache.requests_session()
|
||||||
|
|
||||||
_pillar_api = pillarsdk.Api(endpoint=pillar_endpoint,
|
_noncaching_api = pillarsdk.Api(endpoint=pillar_endpoint,
|
||||||
username=subclient['subclient_user_id'],
|
username=subclient['subclient_user_id'],
|
||||||
password=SUBCLIENT_ID,
|
password=SUBCLIENT_ID,
|
||||||
token=subclient['token'])
|
token=subclient['token'])
|
||||||
|
_noncaching_api.requests_session = uncached_session
|
||||||
|
|
||||||
return _pillar_api
|
_pillar_api = {
|
||||||
|
True: _caching_api,
|
||||||
|
False: _noncaching_api,
|
||||||
|
}
|
||||||
|
|
||||||
|
return _pillar_api[caching]
|
||||||
|
|
||||||
|
|
||||||
# No more than this many Pillar calls should be made simultaneously
|
# No more than this many Pillar calls should be made simultaneously
|
||||||
pillar_semaphore = asyncio.Semaphore(3)
|
pillar_semaphore = asyncio.Semaphore(3)
|
||||||
|
|
||||||
|
|
||||||
async def pillar_call(pillar_func, *args, **kwargs):
|
async def pillar_call(pillar_func, *args, caching=True, **kwargs):
|
||||||
partial = functools.partial(pillar_func, *args, api=pillar_api(), **kwargs)
|
partial = functools.partial(pillar_func, *args, api=pillar_api(caching=caching), **kwargs)
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
|
|
||||||
async with pillar_semaphore:
|
async with pillar_semaphore:
|
||||||
|
Reference in New Issue
Block a user