Saturday, August 1, 2020

Python ASGI CLI

Call ASGI Python application module from command line (without an application server), just like CURL. Interested? You need to install asgi-cli package:
pip install asgi-cli

Usage

asgi-cli --help
usage: asgi-cli [-h] [--version] [-X COMMAND] [-I] [-H HEADER] [-d DATA] [-b]
                [-n NUMBER] [-v]
                app [url]

positional arguments:
  app                   an application module or file
  url                   a uniform resource locator or path (default /)

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -X COMMAND, --request COMMAND
                        specify request command to use, e.g. POST (default
                        GET)
  -I, --head            show status and headers only
  -H HEADER, --header HEADER
                        pass custom header line, e.g. -H='Accept:
                        application/json'
  -d DATA               request body data, e.g. '{"msg":"hello"}', 'msg=hello'
  -b, --benchmark       issue a number of requests through repeated
                        iterations, (reports throughtput and average call
                        time)
  -n NUMBER             a number of requests to issue (default 100K)
  -v, --verbose         make the operation more talkative

Examples

example.py:
START = {
    "type": "http.response.start",
    "status": 200,
    "headers": [
        (b"content-length", b"13"),
        (b"content-type", b"text/html; charset=utf-8"),
    ],
}

BODY1 = {
    "type": "http.response.body",
    "body": b"Hello",
}

BODY2 = {
    "type": "http.response.body",
    "body": b", world!",
}


async def app(scope, receive, send) -> None:
    await send(START)
    await send(BODY1)
    await send(BODY2)
Then run the examples:

asgi-cli example:app prints response body:
Hello, world!
asgi-cli -v example:app pretty prints scope and sent messages:
{'scope': {'asgi': {'spec_version': '2.1', 'version': '3.0'},
           'client': ('127.0.0.1', 49327),
           'headers': [(b'accept', b'*/*'),
                       (b'user-agent', b'asgi-cli/0.0.1'),
                       (b'host', b'127.0.0.1:8000')],
           'http_version': '1.1',
           'method': 'GET',
           'path': '/',
           'query_string': b'',
           'raw_path': b'/',
           'root_path': '',
           'scheme': 'http',
           'server': ('127.0.0.1', 8000),
           'type': 'http'}}
{'message': {'headers': [(b'content-length', b'13'),
                         (b'content-type', b'text/html; charset=utf-8')],
             'status': 200,
             'type': 'http.response.start'}}
{'message': {'body': b'Hello', 'type': 'http.response.body'}}
{'message': {'body': b', world!', 'type': 'http.response.body'}}
asgi-cli -b example:app shows execution stats (runs in 3 iterations, for each iteration displays requests per second and an average call time):
 #1 => 706.26K, 1.42μs
 #2 => 688.64K, 1.45μs
 #3 => 733.55K, 1.36μs
If you’re using this tool, ★Star github repository to show your interest, please!

No comments :

Post a Comment