Panther
Is A Fast & Friendly, Web Framework For Building Async APIs With Python 3.11+
Full Documentation -> https://pantherpy.github.io
Features
- Document-oriented Databases ODM (PantherDB, MongoDB)
- Visual API Monitoring (In Terminal)
- Cache APIs (In Memory, In Redis)
- Built-in Authentication Classes (Customizable)
- Built-in Permission Classes (Customizable)
- Handle Custom Middlewares
Benchmark
We implemented most of the Python frameworks and sent
25,000
requests per second
for 10
seconds
(Total 250,000
requests)
in the same environment
with https://github.com/nakabonne/ali and here's the result:
you can find the detailed results & source codes here --> benchmarks
Framework | Throughput | Request Handled | Max Latencies |
---|---|---|---|
Sanic | 23,326 | 233,842 | 268.8ms |
Panther | 14,719 | 147,595 | 113.1ms |
FastAPI | 14,573 | 146,467 | 155.1ms |
Tornado | 4,969 | 50.585 | 426.5ms |
Flask | 3,555 | 36,396 | 1.2s |
Django | 2,188 | 22,814 | 526.3ms |
Bottle | 1,226 | 39,650 | 30.0s |
Pyramid | 1,023 | 30,912 | 30.0s |
Cherrypy | 639 | 24,944 | 30.0s |
Installation
-
Create a Virtual Environment
$ python -m venv .venv
-
Active The Environment
* Linux & Mac$ source .venv/bin/activate
* Windows$ .\.venv\Scripts\activate
-
Install Panther
* Normal$ pip install panther
* Include JWT Authentication$ pip install panther[full]
Usage
-
$ panther create <project_name> <directory>
-
Panther Uses Uvicorn as ASGI (Asynchronous Server Gateway Interface)
$ panther run
-
$ panther monitor
-
Panther Uses bpython for shell
$ panther shell
Example
-
$ panther create myproject
-
core/configs.py:
URLs = 'core/urls.py'
core/urls.py:
from app.urls import urls as app_urls urls = { '/': app_urls, }
app/urls.py:
from app.apis import hello_world, info urls = { '': hello_world, 'info/': info, }
app/apis.py:
from datetime import datetime from panther.app import API from panther.configs import config from panther import version, status from panther.request import Request from panther.response import Response @API() async def hello_world(): return {'detail': 'Hello World'} @API(cache=True) async def info(request: Request): data = { 'version': version(), 'datetime_now': datetime.now().isoformat(), 'user_agent': request.headers.user_agent, 'db_engine': config['db_engine'], } return Response(data=data, status_code=status.HTTP_202_ACCEPTED)
-
Then run (
$ panther run
) the project, now you can see these two urls:
More examples: https://github.com/AliRn76/panther/tree/master/example.