Recursive Calls

Sometimes you might need to make a different request before executing what you really want to do. For example, to download user data, you need to login first. You can do that by using coroutine dbgr.response().

Warning

DBGR doesn’t detect or prevent recursion. Be careful not to unintentionally cause DDoS on your (or someone else’s) servers.

Response accepts one required argument - the name of the request to execute as string:

dbgr.response(request_name, env=None, session=None, use_defaults=False, cache=True, silent=False, **kwargs)

Coroutine to make recursive requests.

All kwargs will be mapped to arguments required by target request. Kwargs that are not required by target request will be ignored.

Parameters:
  • request_name (str) – Name of fully qualified name of a request to execute
  • environment (configparser.ConfigParser) – Instance of configparser.ConfigParser with loaded environment variables. Pass this argument only if you want to call request with environment different from current one. (optional)
  • session (aiohttp.ClientSession) – Instance of aiohttp.ClientSession that will be used to make requests. Leave the argument empty, if you want to use current session. (optional)
  • use_defaults (bool) – Boolean flag if DBGR should use default argument value wherever possible. It’s equivalent for to using --use-defaults in terminal. More about it in Arguments section. (optional)
  • cache (bool) – Boolean flag if DBGR should use return value from cache, if available. Applicable only to requests with cache turned on. More about it in Cache section. (optional)
  • silent (bool) – If set to True recursive call (and all other recursive call in the tree bellow) will not print any output. (optional)
from dbgr import request, response, secret

@request
async def login(session, username, password:secret) -> secret:
    res = await session.post('https://example.com/login', data={
        'username': username,
        'password': password
    )
    data = await res.json()
    return data['jwt']

@request
async def get_profile(session):
    jwt = await response('login')
    res = await session.get('https://example.com/profile/me', headers={
        'Authorization': f'Bearer {jwt}'
    })
$ dbgr r get_profile
username: jakub@tesarek.me
password [type: secret]:
> POST https://example.com/login
< 200 OK
Result (string):
c*********************e

> GET https://example.com/profile/me
> 200 OK

Tip

You can call requests with fully qualified name in the same way you do when calling requests from terminal.