ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Esmerald

Esmerald

πŸš€ ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒ Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈ написании ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для любого прилоТСния. πŸš€

Test Suite Package version Supported Python versions


ДокумСнтация: 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.

Для классичСского, прямого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅:

src/app.py
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 позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π½Π° любом ΡƒΡ€ΠΎΠ²Π½Π΅.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ (ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹)

src/myapp/accounts/controllers.py
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)

myapp/accounts/urls.py
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.

src/urls.py
from esmerald import Include

route_patterns = [Include(namespace="myapp.accounts.urls", pattern="my_urls")]
src/myapp/urls.py
from myapp.accounts.urls import route_patterns

from esmerald import Include

route_patterns = [Include(routes=route_patterns)]

Если path Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ /.

Using a different pattern

src/myapp/accounts/urls.py
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),
]
src/myapp/urls.py
from esmerald import Include

route_patterns = [Include(namespace="myapp.accounts.urls", pattern="my_urls")]

Include ΠΈ Esmerald

Include ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½, особСнно ΠΊΠΎΠ³Π΄Π° Ρ†Π΅Π»ΡŒ β€” ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ мноТСства ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для создания экзСмпляра Esmerald.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

src/urls.py
from esmerald import Include

route_patterns = [Include(namespace="myapp.accounts.urls", pattern="my_urls")]
src/app.py
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 ΠΈ ΡΡ‚Π°Ρ‚ΡŒ ΠžΡΠΎΠ±Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π›Π΅Π³Π΅Π½Π΄ΠΎΠΉ.