Robyn - 高速、イノベーターフレンドリー、コミュニティ主導型の Python Web フレームワーク
本家: Robyn - A Fast, Innovator Friendly, and Community Driven Python Web Framework.
ソースコード: sparckles/Robyn: Robyn is a Super Fast Async Python Web Framework with a Rust runtime.
ドキュメント: Robyn API documentation
プロジェクトの作成
公式: https://robyn.tech/documentation/example_app#installing-robyn
https://robyn.tech/documentation/api_reference#installing-robyn
公式サンプル: sparckles/example_robyn_app
$ mkdir -p robyn_proj && cd robyn_proj $ python -m venv .venv && . .venv/bin/activate && pip install -U pip
Requirement already satisfied: pip in ./.venv/lib64/python3.12/site-packages (23.3.2) Collecting pip Downloading pip-24.1-py3-none-any.whl.metadata (3.6 kB) Downloading pip-24.1-py3-none-any.whl (1.8 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 8.7 MB/s eta 0:00:00 Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 23.3.2 Uninstalling pip-23.3.2: Successfully uninstalled pip-23.3.2 Successfully installed pip-24.1
(.venv) $ pip install robyn robyn[templating]
Collecting robyn Downloading robyn-0.56.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.6 kB) Collecting watchdog==2.2.1 (from robyn) Downloading watchdog-2.2.1-py3-none-manylinux2014_x86_64.whl.metadata (34 kB) Collecting multiprocess==0.70.14 (from robyn) Downloading multiprocess-0.70.14-py310-none-any.whl.metadata (6.6 kB) Collecting nestd==0.3.1 (from robyn) Downloading nestd-0.3.1-py3-none-any.whl.metadata (3.4 kB) Collecting inquirerpy==0.3.4 (from robyn) Downloading InquirerPy-0.3.4-py3-none-any.whl.metadata (8.1 kB) Collecting rustimport==1.3.4 (from robyn) Downloading rustimport-1.3.4-py3-none-any.whl.metadata (13 kB) Collecting orjson==3.9.15 (from robyn) Downloading orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (49 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 49.5/49.5 kB 5.6 MB/s eta 0:00:00 Collecting uvloop~=0.19.0 (from robyn) Downloading uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.9 kB) Collecting pfzy<0.4.0,>=0.3.1 (from inquirerpy==0.3.4->robyn) Downloading pfzy-0.3.4-py3-none-any.whl.metadata (4.9 kB) Collecting prompt-toolkit<4.0.0,>=3.0.1 (from inquirerpy==0.3.4->robyn) Downloading prompt_toolkit-3.0.47-py3-none-any.whl.metadata (6.4 kB) Collecting dill>=0.3.6 (from multiprocess==0.70.14->robyn) Downloading dill-0.3.8-py3-none-any.whl.metadata (10 kB) Collecting toml>=0.10.2 (from rustimport==1.3.4->robyn) Downloading toml-0.10.2-py2.py3-none-any.whl.metadata (7.1 kB) Collecting jinja2==3.0.1 (from robyn[templating]) Downloading Jinja2-3.0.1-py3-none-any.whl.metadata (3.5 kB) Collecting MarkupSafe>=2.0 (from jinja2==3.0.1->robyn[templating]) Downloading MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB) Collecting wcwidth (from prompt-toolkit<4.0.0,>=3.0.1->inquirerpy==0.3.4->robyn) Downloading wcwidth-0.2.13-py2.py3-none-any.whl.metadata (14 kB) Downloading robyn-0.56.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3/2.3 MB 8.7 MB/s eta 0:00:00 Downloading InquirerPy-0.3.4-py3-none-any.whl (67 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.7/67.7 kB 9.1 MB/s eta 0:00:00 Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.3/134.3 kB 10.3 MB/s eta 0:00:00 Downloading nestd-0.3.1-py3-none-any.whl (2.8 kB) Downloading orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 138.7/138.7 kB 10.1 MB/s eta 0:00:00 Downloading rustimport-1.3.4-py3-none-any.whl (26 kB) Downloading watchdog-2.2.1-py3-none-manylinux2014_x86_64.whl (78 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 79.0/79.0 kB 10.8 MB/s eta 0:00:00 Downloading Jinja2-3.0.1-py3-none-any.whl (133 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.7/133.7 kB 11.1 MB/s eta 0:00:00 Downloading uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.2/4.2 MB 11.4 MB/s eta 0:00:00 Downloading dill-0.3.8-py3-none-any.whl (116 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 116.3/116.3 kB 9.0 MB/s eta 0:00:00 Downloading MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB) Downloading pfzy-0.3.4-py3-none-any.whl (8.5 kB) Downloading prompt_toolkit-3.0.47-py3-none-any.whl (386 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 386.4/386.4 kB 10.3 MB/s eta 0:00:00 Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB) Downloading wcwidth-0.2.13-py2.py3-none-any.whl (34 kB) Installing collected packages: wcwidth, watchdog, uvloop, toml, prompt-toolkit, pfzy, orjson, nestd, MarkupSafe, dill, rustimport, multiprocess, jinja2, inquirerpy, robyn Successfully installed MarkupSafe-2.1.5 dill-0.3.8 inquirerpy-0.3.4 jinja2-3.0.1 multiprocess-0.70.14 nestd-0.3.1 orjson-3.9.15 pfzy-0.3.4 prompt-toolkit-3.0.47 robyn-0.56.0 rustimport-1.3.4 toml-0.10.2 uvloop-0.19.0 watchdog-2.2.1 wcwidth-0.2.13
(.venv) $ python -m robyn --create
? Directory Path: . ? Need Docker? (Y/N) Y ? Please select project type (Mongo/Postgres/Sqlalchemy/Prisma): Postgres Creating a new Robyn project '/home/tomoyan/my_projects/robyn_proj'... New Robyn project created in '/home/tomoyan/my_projects/robyn_proj'
(.venv) $ tree
. ├── Dockerfile ├── __pycache__ │ └── app.cpython-312.pyc ├── app.py ├── requirements.txt └── supervisord.conf 2 directories, 5 files
(.venv) $ bat app.py
1 import psycopg2 2 from robyn import Robyn 3 4 DB_NAME = "postgresDB" 5 DB_HOST = "localhost" 6 DB_USER = "postgres" 7 DB_PASS = "password" 8 DB_PORT = "5455" 9 10 conn = psycopg2.connect(database=DB_NAME, host=DB_HOST, user=DB_USER, password=DB_PASS, port=DB_PORT) 11 12 app = Robyn(__file__) 13 14 15 # create a route to fetch all users 16 @app.get("/users") 17 def get_users(): 18 cursor = conn.cursor() 19 cursor.execute("SELECT * FROM users") 20 all_users = cursor.fetchall() 21 return {"users": all_users} 22 23 24 @app.get("/") 25 def index(): 26 return "Hello World!" 27 28 29 if __name__ == "__main__": 30 app.start(url="0.0.0.0", port=8080)