Esmerald¶
π ΠΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π»Π΅Π³ΠΊΠΎΡΡΡ Π² ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. π
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ: https://esmerald.dev π
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄: https://github.com/dymmond/esmerald
Esmerald β ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ, ΠΌΠΎΡΠ½ΡΠΉ, Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π²Π΅Π±-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ API, Π½ΠΎ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β ΠΎΡ ΡΠ°ΠΌΡΡ ΠΌΠ°Π»ΡΡ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΊΡΡΠΏΠ½ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ.
Esmerald ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π»ΡΡ Π΄Π»Ρ Python 3.8+ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΡΠΈΠΏΠΎΠ² (type hints) Python, ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΡΠΈΡΠΎΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌ Lilya ΠΈ Pydantic/msgspec.
Success
ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²ΡΠΏΡΡΠ΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ.
ΠΠΎΡΠΈΠ²Π°ΡΠΈΡ¶
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ ΡΠ°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ FastAPI, Flama, Flask, Django ΠΈ Π΄ΡΡΠ³ΠΈΠ΅, ΡΠ΅ΡΠ°ΡΡΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΏΠΎΠ²ΡΠ΅Π΄Π½Π΅Π²Π½ΡΡ Π·Π°Π΄Π°Ρ Π΄Π»Ρ 99% ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠΎΡ 1%, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π±Π΅Π· ΠΎΡΠΎΠ±ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ.
Esmerald ΡΠ΅ΡΠΏΠ°Π΅Ρ Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ Π² ΡΡΠΈΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°Ρ ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π²ΡΠ΅ΠΌΠΈ ΠΈΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ Π±ΠΈΠ·Π½Π΅ΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Starlite Π²Π΄ΠΎΡ Π½ΠΎΠ²ΠΈΠ» Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ΅ΡΠΎΠ² ΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Signature, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Pydantic. FastAPI Π²Π΄ΠΎΡ Π½ΠΎΠ²ΠΈΠ» Π΄ΠΈΠ·Π°ΠΉΠ½ API, Django β ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, Flask β ΠΏΡΠΎΡΡΠΎΡΡ, NestJS β ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
ΠΠ»Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, ΡΠ°ΠΊ ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΡ.
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ¶
- Python 3.8+
Esmerald Π½Π΅ Π±ΡΠ» Π±Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π±Π΅Π· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π΄Π²ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²:
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°¶
$ pip install esmerald
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ASGI ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ Uvicorn, Π½ΠΎ Π²ΡΠ±ΠΎΡ ΠΎΡΡΠ°Π΅ΡΡΡ Π·Π° Π²Π°ΠΌΠΈ.
$ pip install uvicorn
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°::
$ pip install esmerald[schedulers]
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° JWT, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π½ΡΡΡΠΈ Esmerald::
$ pip install esmerald[jwt]
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Esmerald::
$ pip install esmerald[test]
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ Esmerald::
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π·Π΄Π΅ΡΡ ΠΏΠΎ ΡΠ΅ΠΌΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
$ pip install esmerald[ipython] # default shell
$ pip install esmerald[ptpython] # ptpython shell
ΠΠ°ΡΠ°Π»ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²¶
Warning
ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΡΠ°ΡΡΡΠΈΡΠ°Π½Ρ Π½Π° ΠΎΠΏΡΡΠ½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ Esmerald (ΠΈΠ»ΠΈ Python Π² ΡΠ΅Π»ΠΎΠΌ), ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π·Π°ΡΡΡΠ΄Π½Π΅Π½ΠΈΠΉ. ΠΡΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΡΡΠ²ΡΡΠ²ΡΠ΅ΡΠ΅ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΠΈΠ·ΡΡΠ°ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Π·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ Esmerald.
Π§ΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ Esmerald ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅:
esmerald createproject <YOUR-PROJECT-NAME> --simple
ΠΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°ΡΠΊΠ°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Esmerald.
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ EsmeraldTestClient, ΡΠ°ΠΊ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅:
$ pip install esmerald[test]
ΠΡΡ ΡΠ°ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ EsmeraldTestClient.
ΠΠΎΠ΄ΡΠΎΠ±Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΡΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π΅ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
Warning
ΠΠ°ΠΏΡΡΠΊ ΡΡΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΡΠΊΠ°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΈ Π΄Π»Ρ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΡΠΎΡ ΠΊΠ°ΡΠΊΠ°Ρ Π»ΠΈΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ, Π½ΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ¶
- ΠΡΡΡΡΡΠΉ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ: ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Lilya ΠΈ Pydantic/msgpec.
- ΠΡΡΡΡΠΎΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅: ΠΡΠΎΡΡΠΎΡΠ° Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠ°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
- ΠΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ: ΠΡΠ»ΠΈ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°ΠΌΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Esmerald Π½Π΅ ΡΠΎΡΡΠ°Π²ΠΈΡ ΡΡΡΠ΄Π°.
- ΠΡΠΎΡΡΠΎΡΠ°: Π‘ΠΎΠ·Π΄Π°Π½ Ρ ΡΡΠ΅ΡΠΎΠΌ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΈ Π»Π΅Π³ΠΊΠΎΡΡΠΈ Π² ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ.
- ΠΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ: ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΠΠΠ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° SOLID.
- ΠΠΎΡΠΎΠ²ΡΠΉ ΠΊ ΡΠ°Π±ΠΎΡΠ΅: ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Ρ Π³ΠΎΡΠΎΠ²ΡΠΌ ΠΊ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Ρ ΠΊΠΎΠ΄ΠΎΠΌ.
- ΠΠΠ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠΈΠ»Ρ: ΠΡΠΎΠ΅ΠΊΡΠΈΡΡΠΉΡΠ΅ API Π»ΡΠ±ΡΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠΠ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ.
- ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ, ΡΠ°ΠΊ ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌΡ.
- Middleware: ΠΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ middleware Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ API.
- ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ: ΠΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅.
- Permissions: ΠΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ permissions Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ API.
- Interceptors: ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ.
- ΠΠ»Π°Π³ΠΈΠ½Ρ: Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π΄Π»Ρ Esmerald ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠΉΡΠ΅ ΠΈΡ Π² Π»ΡΠ±ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΡΠΉΡΠ΅ ΡΠ²ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ.
- DAO ΠΈ AsyncDAO: ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· API, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π±ΠΈΠ·Π½Π΅Ρ-ΠΎΠ±ΡΠ΅ΠΊΡΡ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ORM: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Saffier ΠΈ [Edgy][_orm].
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ODM: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Mongoz.
- APIView: ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΊΠ»Π°ΡΡΠΎΠ².
- JSON ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ/Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° UJSON ΠΈ ORJSON.
- Lifespan: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° lifespan Lilya.
- ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ: ΠΠ°ΠΊ Π² Π»ΡΠ±ΠΎΠΌ Ρ ΠΎΡΠΎΡΠ΅ΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅.
- ΠΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π·Π°Π΄Π°Ρ Π² ΡΠΎΠ½Π΅.
- ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π΄Π»Ρ ΡΠΈΡΡΠΎΡΡ ΠΊΠΎΠ΄Π°.
- msgspec β ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°
msgspec
.
ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊ Lilya ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°ΠΌ¶
Esmerald ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Lilya. ΠΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½ΠΎ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ.
Esmerald ΠΏΠΎΠΎΡΡΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΊ Π΄ΠΈΠ·Π°ΠΉΠ½Ρ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΄Π»Ρ ΠΌΠ°Π»ΡΡ , ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΊΡΡΠΏΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½Π΅ ΠΈΡΠΏΡΡΡΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΡΡ.
ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ¶
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΊ Π±ΡΡΡΡΠΎ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Esmerald.
ΠΠ»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ uvicorn
.
#!/usr/bin/env python
import uvicorn
from esmerald import Esmerald, Gateway, JSONResponse, Request, get
@get()
def welcome() -> JSONResponse:
return JSONResponse({"message": "Welcome to Esmerald"})
@get()
def user(user: str) -> JSONResponse:
return JSONResponse({"message": f"Welcome to Esmerald, {user}"})
@get()
def user_in_request(request: Request) -> JSONResponse:
user = request.path_params["user"]
return JSONResponse({"message": f"Welcome to Esmerald, {user}"})
app = Esmerald(
routes=[
Gateway("/esmerald", handler=welcome),
Gateway("/esmerald/{user}", handler=user),
Gateway("/esmerald/in-request/{user}", handler=user_in_request),
]
)
if __name__ == "__main__":
uvicorn.run(app, port=8000)
ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ endpoints.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Esmerald Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°¶
Π§ΡΠΎΠ±Ρ Π±ΡΡΡΡΠΎ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Esmerald, Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ. ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ
ΡΠ΄Π΅Π»Π°ΡΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ uvicorn
.
#!/usr/bin/env python
import uvicorn
from esmerald import Esmerald, Gateway, JSONResponse, Request, get
app = Esmerald()
@app.get("/esmerald")
def welcome() -> JSONResponse:
return JSONResponse({"message": "Welcome to Esmerald"})
@app.get("/esmerald/{user}")
def user(user: str) -> JSONResponse:
return JSONResponse({"message": f"Welcome to Esmerald, {user}"})
@app.get("/esmerald/in-request/{user}")
def user_in_request(request: Request) -> JSONResponse:
user = request.path_params["user"]
return JSONResponse({"message": f"Welcome to Esmerald, {user}"})
if __name__ == "__main__":
uvicorn.run(app, port=8000)
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ¶
ΠΠ°ΠΊ ΠΈ Π² Π»ΡΠ±ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅, ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π³Π»Π°Π²Π½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΡΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ Π²ΠΎΡΠΏΡΠΈΡΡΠΈΡ.
Esmerald ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. ΠΠ°Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Esmerald.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°:
from example import ApplicationObjectExample
# ExampleObject β ΡΡΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ,
# ΠΈ ΠΎΠ½ ΡΠ»ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°
app = ApplicationObjectExample(setting_one=..., setting_two=..., setting_three=...)
ΠΠ΄ΠΎΡ Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ Django ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ pydantic, Esmerald ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°Π·Ρ Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ».
Esmerald:
from esmerald import Esmerald
app = Esmerald()
Π ΡΡΠΎ Π²ΡΠ΅! ΠΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ! ΠΠΎΡΠ΅ΠΌΡ?
ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ESMERALD_SETTINGS_MODULE
Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°,
ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΡ
Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°? ΠΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ.
from esmerald import Esmerald
app = Esmerald(app_name='My App', title='My title')
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΠΌΠΎΠ΄ΡΠ»Π΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Esmerald.
ΠΠΎΠ΄ΡΠ»Ρ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Esmerald¶
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
ESMERALD_SETTINGS_MODULE
. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ ΡΠΊΠ°Π·Π°Π½Π°, ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
EsmeraldAPISettings
ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ¶
Π Π½Π°ΡΠ΅ Π²ΡΠ΅ΠΌΡ Π²Π°ΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΠΌ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Esmerald Π±ΡΠ΄Π΅Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ pydantic ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ Ρ Esmerald. Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π·Ρ, Ρ ΠΎΡΡ ΡΡΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β production.
from esmerald import EsmeraldAPISettings
from esmerald.conf.enums import EnvironmentType
class Development(EsmeraldAPISettings):
app_name: str = 'My app in dev'
environment: str = EnvironmentType.DEVELOPMENT
ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π² Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Esmerald:
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Esmerald Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ src/app.py
.
ESMERALD_SETTINGS_MODULE='myapp.settings.Development' python -m src.app.py
$env:ESMERALD_SETTINGS_MODULE="myapp.settings.Development"; python -m src.app.py
Gateway, WebSocketGateway ΠΈ Include¶
Lilya ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΊΠ»Π°ΡΡΡ Path
Π΄Π»Ρ ΠΏΡΠΎΡΡΡΡ
Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΡΡΠ΅ΠΉ, Π½ΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ΅Π½Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ,
Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΡΠΎ-ΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅. Esmerald ΡΠ°ΡΡΠΈΡΡΠ΅Ρ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ
'ΡΡΠΈΠ»Ρ', ΡΠ»ΡΡΡΠ°Ρ Π΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Gateway,
WebSocketGateway ΠΈ Include.
ΠΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ Π²ΡΠ΅ΠΉ ΠΌΠ°Π³ΠΈΠΈ Esmerald.
ΠΠ»Ρ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ, ΠΏΡΡΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅:
from esmerald import Esmerald, Gateway, JSONResponse, Request, Websocket, WebSocketGateway, get, status
@get(status_code=status.HTTP_200_OK)
async def home() -> JSONResponse:
return JSONResponse({
"detail": "Hello world"
})
@get()
async def another(request: Request) -> dict:
return {
"detail": "Another world!"
}
@websocket(path="/{path_param:str}")
async def world_socket(socket: Websocket) -> None:
await socket.accept()
msg = await socket.receive_json()
assert msg
assert socket
await socket.close()
app = Esmerald(routes=[
Gateway(handler=home),
Gateway(handler=another),
WebSocketGateway(handler=world_socket),
])
ΠΠΈΠ·Π°ΠΉΠ½ ΠΌΠ°ΡΡΡΡΡΠΎΠ²¶
Π₯ΠΎΡΠΎΡΠΈΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΠ΅ΡΡΡ ΠΈ Esmerald ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΡ Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅.
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ (ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ)¶
from pydantic import BaseModel
from esmerald import (
APIView,
JSONResponse,
Request,
Response,
WebSocket,
get,
post,
put,
status,
websocket,
)
class Product(BaseModel):
name: str
sku: str
price: float
@put("/product/{product_id}")
def update_product(product_id: int, data: Product) -> dict:
return {"product_id": product_id, "product_name": data.name}
@get(status_code=status.HTTP_200_OK)
async def home() -> JSONResponse:
return JSONResponse({"detail": "Hello world"})
@get()
async def another(request: Request) -> dict:
return {"detail": "Another world!"}
@websocket(path="/{path_param:str}")
async def world_socket(socket: WebSocket) -> None:
await socket.accept()
msg = await socket.receive_json()
assert msg
assert socket
await socket.close()
class World(APIView):
@get(path="/{url}")
async def home(self, request: Request, url: str) -> Response:
return Response(f"URL: {url}")
@post(path="/{url}", status_code=status.HTTP_201_CREATED)
async def mars(self, request: Request, url: str) -> JSONResponse: ...
@websocket(path="/{path_param:str}")
async def pluto(self, socket: WebSocket) -> None:
await socket.accept()
msg = await socket.receive_json()
assert msg
assert socket
await socket.close()
ΠΡΠ»ΠΈ path
Π½Π΅ ΡΠΊΠ°Π·Π°Π½, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ /
.
Gateways (urls)¶
from esmerald import Gateway, WebSocketGateway
from .controllers import home, another, world_socket, World
route_patterns = [
Gateway(handler=home),
Gateway(handler=another),
Gateway(handler=World),
WebSocketGateway(handler=world_socket),
]
ΠΡΠ»ΠΈ path
Π½Π΅ ΡΠΊΠ°Π·Π°Π½, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ /
.
Include¶
ΠΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ
Π»ΡΠ±ΠΎΠΉ ΠΌΠ°ΡΡΡΡΡ ΠΈΠ· Π»ΡΠ±ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Include
ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΈΠΌΠΏΠΎΡΡ ΡΠ΅ΡΠ΅Π· namespace
ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΡΠΏΠΈΡΠΎΠΊ routes
, Π½ΠΎ Π½Π΅ ΠΎΠ±Π° ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ namespace
Include
Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ route_patterns
Π²
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ Π΄ΡΡΠ³ΠΎΠ΅.
Note
Π¨Π°Π±Π»ΠΎΠ½ (route_patterns) ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΈΠΌΠΏΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ ΡΠ΅ΡΠ΅Π· namespace
, Π° Π½Π΅ ΡΠ΅ΡΠ΅Π· routes
.
from esmerald import Include
route_patterns = [Include(namespace="myapp.accounts.urls", pattern="my_urls")]
from myapp.accounts.urls import route_patterns
from esmerald import Include
route_patterns = [Include(routes=route_patterns)]
ΠΡΠ»ΠΈ path
Π½Π΅ ΡΠΊΠ°Π·Π°Π½, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ /
.
Using a different pattern¶
from esmerald import Gateway, WebSocketGateway
from .controllers import World, another, home, world_socket
my_urls = [
Gateway(handler=update_product),
Gateway(handler=home),
Gateway(handler=another),
Gateway(handler=World),
WebSocketGateway(handler=world_socket),
]
from esmerald import Include
route_patterns = [Include(namespace="myapp.accounts.urls", pattern="my_urls")]
Include ΠΈ Esmerald¶
Include
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠ΅Π»Ρ β ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΈΠΌΠΏΠΎΡΡΠΎΠ² ΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²,
ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΠΎΠ΄ΠΈΠ½ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Esmerald.
ΠΡΠΈΠΌΠ΅Ρ:
from esmerald import Include
route_patterns = [Include(namespace="myapp.accounts.urls", pattern="my_urls")]
from esmerald import Esmerald, Include
app = Esmerald(routes=[Include(namespace="src.urls")])
ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ¶
ΠΠ°ΠΊ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ, ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ uvicorn Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ uvicorn:
uvicorn src:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ¶
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ uvicorn:
ESMERALD_SETTINGS_MODULE=myapp.AppSettings uvicorn src:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
$env:ESMERALD_SETTINGS_MODULE="myapp.AppSettings"; uvicorn src:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ OpenAPI¶
Esmerald ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ OpenAPI.
Esmerald Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ OpenAPI, Π²Π½Π΅Π΄ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ OpenAPIConfig ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π°ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Swagger, ReDoc ΠΈ Stoplight "ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ".
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ OpenAPI, ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ:
- Swagger -
/docs/swagger
. - Redoc -
/docs/redoc
. - Stoplight Elements -
/docs/elements
. - Rapidoc -
/docs/rapidoc
.
Π ΡΡΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π½Π°ΡΡΡΠΎΠΈΡΡ OpenAPIConfig Π·Π΄Π΅ΡΡ.
Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΎ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ OpenAPIResponse.
ΠΠ°ΠΌΠ΅ΡΠΊΠΈ¶
ΠΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΡΠ΅Π½Ρ ΠΎΠ±ΡΠ΅Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΡΡΡΠΎ Π½Π°ΡΠ°ΡΡ ΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ Esmerald. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ Esmerald. ΠΠ°ΡΠ»Π°ΠΆΠ΄Π°ΠΉΡΠ΅ΡΡ! π
Π‘ΠΏΠΎΠ½ΡΠΎΡΡ¶
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ Esmerald Π½Π΅Ρ ΡΠΏΠΎΠ½ΡΠΎΡΠΎΠ², Π½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΠΎ ΠΏΠΎΠΌΠΎΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ Π°Π²ΡΠΎΡΠ° ΡΠ΅ΡΠ΅Π· GitHub sponsors ΠΈ ΡΡΠ°ΡΡ ΠΡΠΎΠ±Π΅Π½Π½ΡΠΌ ΠΈΠ»ΠΈ ΠΠ΅Π³Π΅Π½Π΄ΠΎΠΉ.