🚚 ❌¶
📤 📚 ⚠ 🌐❔ 👆 💪 🚨 ❌ 👩💻 👈 ⚙️ 👆 🛠️.
👉 👩💻 💪 🖥 ⏮️ 🕸, 📟 ⚪️➡️ 👱 🙆, ☁ 📳, ♒️.
👆 💪 💪 💬 👩💻 👈:
- 👩💻 🚫 ✔️ 🥃 😌 👈 🛠️.
- 👩💻 🚫 ✔️ 🔐 👈 ℹ.
- 🏬 👩💻 🔄 🔐 🚫 🔀.
- ♒️.
👫 💼, 👆 🔜 🛎 📨 🇺🇸🔍 👔 📟 ↔ 4️⃣0️⃣0️⃣ (⚪️➡️ 4️⃣0️⃣0️⃣ 4️⃣9️⃣9️⃣).
👉 🎏 2️⃣0️⃣0️⃣ 🇺🇸🔍 👔 📟 (⚪️➡️ 2️⃣0️⃣0️⃣ 2️⃣9️⃣9️⃣). 👈 "2️⃣0️⃣0️⃣" 👔 📟 ⛓ 👈 😫 📤 "🏆" 📨.
👔 📟 4️⃣0️⃣0️⃣ ↔ ⛓ 👈 📤 ❌ ⚪️➡️ 👩💻.
💭 🌐 👈 "4️⃣0️⃣4️⃣ 🚫 🔎" ❌ (& 🤣) ❓
⚙️ HTTPException
¶
📨 🇺🇸🔍 📨 ⏮️ ❌ 👩💻 👆 ⚙️ HTTPException
.
🗄 HTTPException
¶
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return {"item": items[item_id]}
🤚 HTTPException
👆 📟¶
HTTPException
😐 🐍 ⚠ ⏮️ 🌖 📊 🔗 🔗.
↩️ ⚫️ 🐍 ⚠, 👆 🚫 return
⚫️, 👆 raise
⚫️.
👉 ⛓ 👈 🚥 👆 🔘 🚙 🔢 👈 👆 🤙 🔘 👆 ➡ 🛠️ 🔢, & 👆 🤚 HTTPException
⚪️➡️ 🔘 👈 🚙 🔢, ⚫️ 🏆 🚫 🏃 🎂 📟 ➡ 🛠️ 🔢, ⚫️ 🔜 ❎ 👈 📨 ▶️️ ↖️ & 📨 🇺🇸🔍 ❌ ⚪️➡️ HTTPException
👩💻.
💰 🙋♀ ⚠ 🤭 return
😅 💲 🔜 🌖 ⭐ 📄 🔃 🔗 & 💂♂.
👉 🖼, 🕐❔ 👩💻 📨 🏬 🆔 👈 🚫 🔀, 🤚 ⚠ ⏮️ 👔 📟 404
:
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return {"item": items[item_id]}
📉 📨¶
🚥 👩💻 📨 http://example.com/items/foo
( item_id
"foo"
), 👈 👩💻 🔜 📨 🇺🇸🔍 👔 📟 2️⃣0️⃣0️⃣, & 🎻 📨:
{
"item": "The Foo Wrestlers"
}
✋️ 🚥 👩💻 📨 http://example.com/items/bar
(🚫-🚫 item_id
"bar"
), 👈 👩💻 🔜 📨 🇺🇸🔍 👔 📟 4️⃣0️⃣4️⃣ ("🚫 🔎" ❌), & 🎻 📨:
{
"detail": "Item not found"
}
Tip
🕐❔ 🙋♀ HTTPException
, 👆 💪 🚶♀️ 🙆 💲 👈 💪 🗜 🎻 🔢 detail
, 🚫 🕴 str
.
👆 💪 🚶♀️ dict
, list
, ♒️.
👫 🍵 🔁 FastAPI & 🗜 🎻.
🚮 🛃 🎚¶
📤 ⚠ 🌐❔ ⚫️ ⚠ 💪 🚮 🛃 🎚 🇺🇸🔍 ❌. 🖼, 🆎 💂♂.
👆 🎲 🏆 🚫 💪 ⚙️ ⚫️ 🔗 👆 📟.
✋️ 💼 👆 💪 ⚫️ 🏧 😐, 👆 💪 🚮 🛃 🎚:
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items-header/{item_id}")
async def read_item_header(item_id: str):
if item_id not in items:
raise HTTPException(
status_code=404,
detail="Item not found",
headers={"X-Error": "There goes my error"},
)
return {"item": items[item_id]}
❎ 🛃 ⚠ 🐕🦺¶
👆 💪 🚮 🛃 ⚠ 🐕🦺 ⏮️ 🎏 ⚠ 🚙 ⚪️➡️ 💃.
➡️ 💬 👆 ✔️ 🛃 ⚠ UnicornException
👈 👆 (⚖️ 🗃 👆 ⚙️) 💪 raise
.
& 👆 💚 🍵 👉 ⚠ 🌐 ⏮️ FastAPI.
👆 💪 🚮 🛃 ⚠ 🐕🦺 ⏮️ @app.exception_handler()
:
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
class UnicornException(Exception):
def __init__(self, name: str):
self.name = name
app = FastAPI()
@app.exception_handler(UnicornException)
async def unicorn_exception_handler(request: Request, exc: UnicornException):
return JSONResponse(
status_code=418,
content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."},
)
@app.get("/unicorns/{name}")
async def read_unicorn(name: str):
if name == "yolo":
raise UnicornException(name=name)
return {"unicorn_name": name}
📥, 🚥 👆 📨 /unicorns/yolo
, ➡ 🛠️ 🔜 raise
UnicornException
.
✋️ ⚫️ 🔜 🍵 unicorn_exception_handler
.
, 👆 🔜 📨 🧹 ❌, ⏮️ 🇺🇸🔍 👔 📟 418
& 🎻 🎚:
{"message": "Oops! yolo did something. There goes a rainbow..."}
📡 ℹ
👆 💪 ⚙️ from starlette.requests import Request
& from starlette.responses import JSONResponse
.
FastAPI 🚚 🎏 starlette.responses
fastapi.responses
🏪 👆, 👩💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. 🎏 ⏮️ Request
.
🔐 🔢 ⚠ 🐕🦺¶
FastAPI ✔️ 🔢 ⚠ 🐕🦺.
👫 🐕🦺 🈚 🛬 🔢 🎻 📨 🕐❔ 👆 raise
HTTPException
& 🕐❔ 📨 ✔️ ❌ 💽.
👆 💪 🔐 👫 ⚠ 🐕🦺 ⏮️ 👆 👍.
🔐 📨 🔬 ⚠¶
🕐❔ 📨 🔌 ❌ 📊, FastAPI 🔘 🤚 RequestValidationError
.
& ⚫️ 🔌 🔢 ⚠ 🐕🦺 ⚫️.
🔐 ⚫️, 🗄 RequestValidationError
& ⚙️ ⚫️ ⏮️ @app.exception_handler(RequestValidationError)
🎀 ⚠ 🐕🦺.
⚠ 🐕🦺 🔜 📨 Request
& ⚠.
from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
return PlainTextResponse(str(exc.detail), status_code=exc.status_code)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return PlainTextResponse(str(exc), status_code=400)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}
🔜, 🚥 👆 🚶 /items/foo
, ↩️ 💆♂ 🔢 🎻 ❌ ⏮️:
{
"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 ValidationError
.
FastAPI ⚙️ ⚫️ 👈, 🚥 👆 ⚙️ Pydantic 🏷 response_model
, & 👆 💽 ✔️ ❌, 👆 🔜 👀 ❌ 👆 🕹.
✋️ 👩💻/👩💻 🔜 🚫 👀 ⚫️. ↩️, 👩💻 🔜 📨 "🔗 💽 ❌" ⏮️ 🇺🇸🔍 👔 📟 500
.
⚫️ 🔜 👉 🌌 ↩️ 🚥 👆 ✔️ Pydantic ValidationError
👆 📨 ⚖️ 🙆 👆 📟 (🚫 👩💻 📨), ⚫️ 🤙 🐛 👆 📟.
& ⏪ 👆 🔧 ⚫️, 👆 👩💻/👩💻 🚫🔜 🚫 ✔️ 🔐 🔗 ℹ 🔃 ❌, 👈 💪 🎦 💂♂ ⚠.
🔐 HTTPException
❌ 🐕🦺¶
🎏 🌌, 👆 💪 🔐 HTTPException
🐕🦺.
🖼, 👆 💪 💚 📨 ✅ ✍ 📨 ↩️ 🎻 👫 ❌:
from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
return PlainTextResponse(str(exc.detail), status_code=exc.status_code)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
return PlainTextResponse(str(exc), status_code=400)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}
📡 ℹ
👆 💪 ⚙️ from starlette.responses import PlainTextResponse
.
FastAPI 🚚 🎏 starlette.responses
fastapi.responses
🏪 👆, 👩💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃.
⚙️ RequestValidationError
💪¶
RequestValidationError
🔌 body
⚫️ 📨 ⏮️ ❌ 💽.
👆 💪 ⚙️ ⚫️ ⏪ 🛠️ 👆 📱 🕹 💪 & ℹ ⚫️, 📨 ⚫️ 👩💻, ♒️.
from fastapi import FastAPI, Request, status
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content=jsonable_encoder({"detail": exc.errors(), "body": exc.body}),
)
class Item(BaseModel):
title: str
size: int
@app.post("/items/")
async def create_item(item: Item):
return item
🔜 🔄 📨 ❌ 🏬 💖:
{
"title": "towel",
"size": "XL"
}
👆 🔜 📨 📨 💬 👆 👈 💽 ❌ ⚗ 📨 💪:
{
"detail": [
{
"loc": [
"body",
"size"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
],
"body": {
"title": "towel",
"size": "XL"
}
}
FastAPI HTTPException
🆚 💃 HTTPException
¶
FastAPI ✔️ 🚮 👍 HTTPException
.
& FastAPI'Ⓜ HTTPException
❌ 🎓 😖 ⚪️➡️ 💃 HTTPException
❌ 🎓.
🕴 🔺, 👈 FastAPI'Ⓜ HTTPException
✔ 👆 🚮 🎚 🔌 📨.
👉 💪/⚙️ 🔘 ✳ 2️⃣.0️⃣ & 💂♂ 🚙.
, 👆 💪 🚧 🙋♀ FastAPI'Ⓜ HTTPException
🛎 👆 📟.
✋️ 🕐❔ 👆 ® ⚠ 🐕🦺, 👆 🔜 ® ⚫️ 💃 HTTPException
.
👉 🌌, 🚥 🙆 🍕 💃 🔗 📟, ⚖️ 💃 ↔ ⚖️ 🔌 -, 🤚 💃 HTTPException
, 👆 🐕🦺 🔜 💪 ✊ & 🍵 ⚫️.
👉 🖼, 💪 ✔️ 👯♂️ HTTPException
Ⓜ 🎏 📟, 💃 ⚠ 📁 StarletteHTTPException
:
from starlette.exceptions import HTTPException as StarletteHTTPException
🏤-⚙️ FastAPI'Ⓜ ⚠ 🐕🦺¶
🚥 👆 💚 ⚙️ ⚠ ⤴️ ⏮️ 🎏 🔢 ⚠ 🐕🦺 ⚪️➡️ FastAPI, 👆 💪 🗄 & 🏤-⚙️ 🔢 ⚠ 🐕🦺 ⚪️➡️ fastapi.exception_handlers
:
from fastapi import FastAPI, HTTPException
from fastapi.exception_handlers import (
http_exception_handler,
request_validation_exception_handler,
)
from fastapi.exceptions import RequestValidationError
from starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)
async def custom_http_exception_handler(request, exc):
print(f"OMG! An HTTP error!: {repr(exc)}")
return await http_exception_handler(request, exc)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
print(f"OMG! The client sent invalid data!: {exc}")
return await request_validation_exception_handler(request, exc)
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 3:
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
return {"item_id": item_id}
👉 🖼 👆 print
😅 ❌ ⏮️ 📶 🎨 📧, ✋️ 👆 🤚 💭. 👆 💪 ⚙️ ⚠ & ⤴️ 🏤-⚙️ 🔢 ⚠ 🐕🦺.