Skip to content

Commit

Permalink
🌐 Add Russian translation for docs/ru/docs/tutorial/handling-errors.md
Browse files Browse the repository at this point in the history
  • Loading branch information
AlertRED committed Oct 3, 2023
1 parent bfde8f3 commit 0b3fc0e
Showing 1 changed file with 261 additions and 0 deletions.
261 changes: 261 additions & 0 deletions docs/ru/docs/tutorial/handling-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

БущСствуСт мноТСство ситуаций, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± ошибкС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌΡƒ ваш API.

Π’Π°ΠΊΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ с Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ΠΎΠΌ, Ρ‡ΡƒΠΆΠΎΠΉ ΠΊΠΎΠ΄, IoT-устройство ΠΈ Ρ‚.Π΄.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ придСтся ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ:

* ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ достаточных ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ для выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
* ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ рСсурсу.
* Π­Π»Π΅ΠΌΠ΅Π½Ρ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ пытался ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ, Π½Π΅ сущСствуСт.
* ΠΈ Ρ‚.Π΄.

Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ возвращаСтся **HTTP-ΠΊΠΎΠ΄ состояния** Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ **400** (ΠΎΡ‚ 400 Π΄ΠΎ 499).

Π­Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΊΠΎΠ΄Π°ΠΌ состояния 200 HTTP (ΠΎΡ‚ 200 Π΄ΠΎ 299). Π­Ρ‚ΠΈ ΠΊΠΎΠ΄Ρ‹ состояния "200" ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ запрос Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

ΠšΠΎΠ΄Ρ‹ состояния Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 400 ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ со стороны ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ всС эти ошибки (ΠΈ ΡˆΡƒΡ‚ΠΊΠΈ) **"404 Not Found "**?

## ИспользованиС `HTTPException`

Для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ HTTP-ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² с ошибками ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `HTTPException`.

### Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ `HTTPException`

```Python hl_lines="1"
{!../../../docs_src/handling_errors/tutorial001.py!}
```

### Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ `HTTPException` Π² своСм ΠΊΠΎΠ΄Π΅

`HTTPException` - это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Python с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ для API.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Python, Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ `Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚`, Π° `Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚`.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая вызываСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ вашСй *Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ*, ΠΈ Π²Ρ‹ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ `HTTPException` Π²Π½ΡƒΡ‚Ρ€ΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ Π² *Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ*, Π° сразу Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ запрос ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ HTTP-ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈΠ· `HTTPException` ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

О Ρ‚ΠΎΠΌ, насколько Π²Ρ‹Π³ΠΎΠ΄Π½Π΅Π΅ `Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ` ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ `Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ рассказано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнном зависимостям ΠΈ бСзопасности.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ элСмСнт ΠΏΠΎ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ID, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с ΠΊΠΎΠ΄ΠΎΠΌ состояния `404`:

```Python hl_lines="11"
{!../../../docs_src/handling_errors/tutorial001.py!}
```

### Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Если ΠΊΠ»ΠΈΠ΅Π½Ρ‚ запросит `http://example.com/items/foo` (`item_id` `"foo"`), Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠΎΠ΄ состояния HTTP 200 ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON:

```JSON
{
"item": "The Foo Wrestlers"
}
```

Но Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ запросит `http://example.com/items/bar` (Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ `item_id` `"bar"`), Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠΎΠ΄ состояния HTTP 404 (ошибка "Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ") ΠΈ JSON-ΠΎΡ‚Π²Π΅Ρ‚ Π² Π²ΠΈΠ΄Π΅:

```JSON
{
"detail": "Item not found"
}
```

!!! tip "Подсказка"
ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ `HTTPException` Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° `detail` ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² JSON, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ `str`.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ `dict`, `list` ΠΈ Ρ‚.Π΄.

Они автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ **FastAPI** ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² JSON.

## Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΊ ошибкС HTTP. НапримСр, для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² бСзопасности.

Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, Π²Π°ΠΌ Π½Π΅ потрСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ нСпосрСдствСнно Π² ΠΊΠΎΠ΄Π΅.

Но Π² случаС, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ³ΠΎ сцСнария, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ:

```Python hl_lines="14"
{!../../../docs_src/handling_errors/tutorial002.py!}
```

## Установка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ <a href="https://www.starlette.io/exceptions/" class="external-link" target="_blank">Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ - ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΎΡ‚ Starlette</a>.

Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ `UnicornException`, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ (ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π²Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°) ΠΌΠΎΠΆΠ΅Ρ‚Π΅ `Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ`.

И Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ глобально с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ FastAPI.

МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ собствСнный ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `@app.exception_handler()`:

```Python hl_lines="5-7 13-18 24"
{!../../../docs_src/handling_errors/tutorial003.py!}
```

Π—Π΄Π΅ΡΡŒ, Ссли Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ `/unicorns/yolo`, Ρ‚ΠΎ опСрация *опСрация ΠΏΡƒΡ‚ΠΈ* Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ `UnicornException`.

Но ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ `unicorn_exception_handler`.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‡ΠΈΡΡ‚ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ с ΠΊΠΎΠ΄ΠΎΠΌ состояния HTTP `418` ΠΈ содСрТимым JSON:

```JSON
{"message": "Oops! yolo did something. There goes a rainbow..."}
```

!!! note "ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ"
Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `from starlette.requests import Request` ΠΈ `from starlette.responses import JSONResponse`.

**FastAPI** прСдоставляСт Ρ‚ΠΎΡ‚ ΠΆΠ΅ `starlette.responses`, Ρ‡Ρ‚ΠΎ ΠΈ `fastapi.responses`, просто для удобства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ доступных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² поступаСт нСпосрСдствСнно ΠΈΠ· Starlette. Π’ΠΎ ΠΆΠ΅ самоС касаСтся ΠΈ `Request`.

## ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ стандартных ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

**FastAPI** ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π­Ρ‚ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ стандартных JSON-ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ `Π²Ρ‹Π·ΠΎΠ²Π΅` `HTTPException` ΠΈ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² запросС нСдопустимых Π΄Π°Π½Π½Ρ‹Ρ….

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ эти ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π° свои собствСнныС.

### ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ запроса

Когда запрос содСрТит нСдопустимыС Π΄Π°Π½Π½Ρ‹Π΅, **FastAPI** Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ `RequestValidationError`.

А Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ `RequestValidationError` ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ с `@app.exception_handler(RequestValidationError)` для создания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `Request` ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

```Python hl_lines="2 14-16"
{!../../../docs_src/handling_errors/tutorial004.py!}
```

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ `/items/foo`, Ρ‚ΠΎ вмСсто стандартной JSON-ошибки с:

```JSON
{
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
```

Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ:

```
1 validation error
path -> item_id
value is not a valid integer (type=type_error.integer)
```

#### `RequestValidationError` ΠΈΠ»ΠΈ `ValidationError`

!!! warning "Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅"
Π­Ρ‚ΠΎ тСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Ссли ΠΎΠ½ΠΈ Π½Π΅ Π²Π°ΠΆΠ½Ρ‹ для вас сСйчас.

`RequestValidationError` являСтся подклассом Pydantic <a href="https://pydantic-docs.helpmanual.io/usage/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>.

**FastAPI** ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Pydantic-модСль Π² `response_model`, ΠΈ ваши Π΄Π°Π½Π½Ρ‹Π΅ содСрТат ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅.

Но ΠΊΠ»ΠΈΠ΅Π½Ρ‚/ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ этого Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚. ВмСсто этого ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сообщСниС "Internal Server Error" с ΠΊΠΎΠ΄ΠΎΠΌ состояния HTTP `500`.

Π’Π°ΠΊ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π² вашСм *ΠΎΡ‚Π²Π΅Ρ‚Π΅* ΠΈΠ»ΠΈ Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π² вашСм ΠΊΠΎΠ΄Π΅ (Π½Π΅ Π² *запросС* ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°) Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Pydantic `ValidationError`, Ρ‚ΠΎ это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ошибка Π² вашСм ΠΊΠΎΠ΄Π΅.

А ΠΏΠΎΠΊΠ° Π²Ρ‹ устраняСтС ΠΎΡˆΠΈΠ±ΠΊΡƒ, ваши ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹/ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ доступа ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ уязвимости Π² систСмС бСзопасности.

### ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок `HTTPException`

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ `HTTPException`.

НапримСр, для этих ошибок ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкстовый ΠΎΡ‚Π²Π΅Ρ‚ вмСсто JSON:

```Python hl_lines="3-4 9-11 22"
{!../../../docs_src/handling_errors/tutorial004.py!}
```

!!! note "ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ"
МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `from starlette.responses import PlainTextResponse`.

**FastAPI** прСдоставляСт Ρ‚ΠΎΡ‚ ΠΆΠ΅ `starlette.responses`, Ρ‡Ρ‚ΠΎ ΠΈ `fastapi.responses`, просто для удобства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ доступных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² поступаСт нСпосрСдствСнно ΠΈΠ· Starlette.

### Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Π΅Π»ΠΎ `RequestValidationError`

Ошибка `RequestValidationError` содСрТит ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ `Ρ‚Π΅Π»ΠΎ` с нСдопустимыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния для рСгистрации Ρ‚Π΅Π»Π° ΠΈ Π΅Π³ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ Ρ‚.Π΄.

```Python hl_lines="14"
{!../../../docs_src/handling_errors/tutorial005.py!}
```

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

```JSON
{
"title": "towel",
"size": "XL"
}
```

Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹, содСрТащий ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Ρ‚Π΅Π»ΠΎ:

```JSON hl_lines="12-15"
{
"detail": [
{
"loc": [
"body",
"size"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
],
"body": {
"title": "towel",
"size": "XL"
}
}
```

#### `HTTPException` Π² FastAPI ΠΈΠ»ΠΈ Π² Starlette

**FastAPI** ΠΈΠΌΠ΅Π΅Ρ‚ свои собствСнныС `HTTPException`.

А класс ошибок **FastAPI** `HTTPException` наслСдуСт ΠΎΡ‚ класса ошибок Starlette `HTTPException`.

ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ `HTTPException` Π² ΠΌΠΎΠ΄Π΅ **FastAPI** позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΎΡ‚Π²Π΅Ρ‚.

Он Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ/ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ систСмы для OAuth 2.0 ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ бСзопасности.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ `HTTPException` ΠΎΡ‚ **FastAPI** ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² своСм ΠΊΠΎΠ΄Π΅.

Но ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ рСгистрируСтС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для `HTTPException` ΠΎΡ‚ Starlette.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли какая-Π»ΠΈΠ±ΠΎ Ρ‡Π°ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° Starlette, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ Starlette Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Starlette `HTTPException`, ваш ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ смоТСт ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Π° `HTTPException` Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Starlette ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ‹ Π² `StarletteHTTPException`:

```Python
from starlette.exceptions import HTTPException as StarletteHTTPException
```

### ΠŸΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ **FastAPI**

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ вмСстС с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· **FastAPI**, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· `fastapi.exception_handlers`:

```Python hl_lines="2-5 15 21"
{!../../../docs_src/handling_errors/tutorial006.py!}
```

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ просто `Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚Π΅` ΠΎΡˆΠΈΠ±ΠΊΡƒ с ΠΎΡ‡Π΅Π½ΡŒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ сообщСниСм, Π½ΠΎ идСя Π²Π°ΠΌ понятна. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ просто ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

0 comments on commit 0b3fc0e

Please sign in to comment.