🗄 ⏲¶
👆 💪 ✍ 🛠️ ⏮️ ➡ 🛠️ 👈 💪 ⏲ 📨 🔢 🛠️ ✍ 👱 🙆 (🎲 🎏 👩💻 👈 🔜 ⚙️ 👆 🛠️).
🛠️ 👈 🔨 🕐❔ 👆 🛠️ 📱 🤙 🔢 🛠️ 📛 "⏲". ↩️ 🖥 👈 🔢 👩💻 ✍ 📨 📨 👆 🛠️ & ⤴️ 👆 🛠️ 🤙 🔙, 📨 📨 🔢 🛠️ (👈 🎲 ✍ 🎏 👩💻).
👉 💼, 👆 💪 💚 📄 ❔ 👈 🔢 🛠️ 🔜 👀 💖. ⚫️❔ ➡ 🛠️ ⚫️ 🔜 ✔️, ⚫️❔ 💪 ⚫️ 🔜 ⌛, ⚫️❔ 📨 ⚫️ 🔜 📨, ♒️.
📱 ⏮️ ⏲¶
➡️ 👀 🌐 👉 ⏮️ 🖼.
🌈 👆 🛠️ 📱 👈 ✔ 🏗 🧾.
👉 🧾 🔜 ✔️ id
, title
(📦), customer
, & total
.
👩💻 👆 🛠️ (🔢 👩💻) 🔜 ✍ 🧾 👆 🛠️ ⏮️ 🏤 📨.
⤴️ 👆 🛠️ 🔜 (➡️ 🌈):
- 📨 🧾 🕴 🔢 👩💻.
- 📈 💸.
- 📨 📨 🔙 🛠️ 👩💻 (🔢 👩💻).
- 👉 🔜 🔨 📨 🏤 📨 (⚪️➡️ 👆 🛠️) 🔢 🛠️ 🚚 👈 🔢 👩💻 (👉 "⏲").
😐 FastAPI 📱¶
➡️ 🥇 👀 ❔ 😐 🛠️ 📱 🔜 👀 💖 ⏭ ❎ ⏲.
⚫️ 🔜 ✔️ ➡ 🛠️ 👈 🔜 📨 Invoice
💪, & 🔢 🔢 callback_url
👈 🔜 🔌 📛 ⏲.
👉 🍕 📶 😐, 🌅 📟 🎲 ⏪ 😰 👆:
from typing import Union
from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Invoice(BaseModel):
id: str
title: Union[str, None] = None
customer: str
total: float
class InvoiceEvent(BaseModel):
description: str
paid: bool
class InvoiceEventReceived(BaseModel):
ok: bool
invoices_callback_router = APIRouter()
@invoices_callback_router.post(
"{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
pass
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
"""
Create an invoice.
This will (let's imagine) let the API user (some external developer) create an
invoice.
And this path operation will:
* Send the invoice to the client.
* Collect the money from the client.
* Send a notification back to the API user (the external developer), as a callback.
* At this point is that the API will somehow send a POST request to the
external API with the notification of the invoice event
(e.g. "payment successful").
"""
# Send the invoice, collect the money, send the notification (the callback)
return {"msg": "Invoice received"}
Tip
callback_url
🔢 🔢 ⚙️ Pydantic 📛 🆎.
🕴 🆕 👜 callbacks=messages_callback_router.routes
❌ ➡ 🛠️ 👨🎨. 👥 🔜 👀 ⚫️❔ 👈 ⏭.
🔬 ⏲¶
☑ ⏲ 📟 🔜 🪀 🙇 🔛 👆 👍 🛠️ 📱.
& ⚫️ 🔜 🎲 🪀 📚 ⚪️➡️ 1️⃣ 📱 ⏭.
⚫️ 💪 1️⃣ ⚖️ 2️⃣ ⏸ 📟, 💖:
callback_url = "https://example.com/api/v1/invoices/events/"
httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
✋️ 🎲 🏆 ⚠ 🍕 ⏲ ⚒ 💭 👈 👆 🛠️ 👩💻 (🔢 👩💻) 🛠️ 🔢 🛠️ ☑, 🛄 💽 👈 👆 🛠️ 🔜 📨 📨 💪 ⏲, ♒️.
, ⚫️❔ 👥 🔜 ⏭ 🚮 📟 📄 ❔ 👈 🔢 🛠️ 🔜 👀 💖 📨 ⏲ ⚪️➡️ 👆 🛠️.
👈 🧾 🔜 🎦 🆙 🦁 🎚 /docs
👆 🛠️, & ⚫️ 🔜 ➡️ 🔢 👩💻 💭 ❔ 🏗 🔢 🛠️.
👉 🖼 🚫 🛠️ ⏲ ⚫️ (👈 💪 ⏸ 📟), 🕴 🧾 🍕.
✍ ⏲ 🧾 📟¶
👉 📟 🏆 🚫 🛠️ 👆 📱, 👥 🕴 💪 ⚫️ 📄 ❔ 👈 🔢 🛠️ 🔜 👀 💖.
✋️, 👆 ⏪ 💭 ❔ 💪 ✍ 🏧 🧾 🛠️ ⏮️ FastAPI.
👥 🔜 ⚙️ 👈 🎏 💡 📄 ❔ 🔢 🛠️ 🔜 👀 💖... 🏗 ➡ 🛠️(Ⓜ) 👈 🔢 🛠️ 🔜 🛠️ (🕐 👆 🛠️ 🔜 🤙).
Tip
🕐❔ ✍ 📟 📄 ⏲, ⚫️ 💪 ⚠ 🌈 👈 👆 👈 🔢 👩💻. & 👈 👆 ⏳ 🛠️ 🔢 🛠️, 🚫 👆 🛠️.
🍕 🛠️ 👉 ☝ 🎑 ( 🔢 👩💻) 💪 ℹ 👆 💭 💖 ⚫️ 🌅 ⭐ 🌐❔ 🚮 🔢, Pydantic 🏷 💪, 📨, ♒️. 👈 🔢 🛠️.
✍ ⏲ APIRouter
¶
🥇 ✍ 🆕 APIRouter
👈 🔜 🔌 1️⃣ ⚖️ 🌅 ⏲.
from typing import Union
from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Invoice(BaseModel):
id: str
title: Union[str, None] = None
customer: str
total: float
class InvoiceEvent(BaseModel):
description: str
paid: bool
class InvoiceEventReceived(BaseModel):
ok: bool
invoices_callback_router = APIRouter()
@invoices_callback_router.post(
"{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
pass
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
"""
Create an invoice.
This will (let's imagine) let the API user (some external developer) create an
invoice.
And this path operation will:
* Send the invoice to the client.
* Collect the money from the client.
* Send a notification back to the API user (the external developer), as a callback.
* At this point is that the API will somehow send a POST request to the
external API with the notification of the invoice event
(e.g. "payment successful").
"""
# Send the invoice, collect the money, send the notification (the callback)
return {"msg": "Invoice received"}
✍ ⏲ ➡ 🛠️¶
✍ ⏲ ➡ 🛠️ ⚙️ 🎏 APIRouter
👆 ✍ 🔛.
⚫️ 🔜 👀 💖 😐 FastAPI ➡ 🛠️:
- ⚫️ 🔜 🎲 ✔️ 📄 💪 ⚫️ 🔜 📨, ✅
body: InvoiceEvent
. - & ⚫️ 💪 ✔️ 📄 📨 ⚫️ 🔜 📨, ✅
response_model=InvoiceEventReceived
.
from typing import Union
from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Invoice(BaseModel):
id: str
title: Union[str, None] = None
customer: str
total: float
class InvoiceEvent(BaseModel):
description: str
paid: bool
class InvoiceEventReceived(BaseModel):
ok: bool
invoices_callback_router = APIRouter()
@invoices_callback_router.post(
"{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
pass
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
"""
Create an invoice.
This will (let's imagine) let the API user (some external developer) create an
invoice.
And this path operation will:
* Send the invoice to the client.
* Collect the money from the client.
* Send a notification back to the API user (the external developer), as a callback.
* At this point is that the API will somehow send a POST request to the
external API with the notification of the invoice event
(e.g. "payment successful").
"""
# Send the invoice, collect the money, send the notification (the callback)
return {"msg": "Invoice received"}
📤 2️⃣ 👑 🔺 ⚪️➡️ 😐 ➡ 🛠️:
- ⚫️ 🚫 💪 ✔️ 🙆 ☑ 📟, ↩️ 👆 📱 🔜 🙅 🤙 👉 📟. ⚫️ 🕴 ⚙️ 📄 🔢 🛠️. , 🔢 💪 ✔️
pass
. - ➡ 💪 🔌 🗄 3️⃣ 🧬 (👀 🌖 🔛) 🌐❔ ⚫️ 💪 ⚙️ 🔢 ⏮️ 🔢 & 🍕 ⏮️ 📨 📨 👆 🛠️.
⏲ ➡ 🧬¶
⏲ ➡ 💪 ✔️ 🗄 3️⃣ 🧬 👈 💪 🔌 🍕 ⏮️ 📨 📨 👆 🛠️.
👉 💼, ⚫️ str
:
"{$callback_url}/invoices/{$request.body.id}"
, 🚥 👆 🛠️ 👩💻 (🔢 👩💻) 📨 📨 👆 🛠️ :
https://yourapi.com/invoices/?callback_url=https://www.external.org/events
⏮️ 🎻 💪:
{
"id": "2expen51ve",
"customer": "Mr. Richie Rich",
"total": "9999"
}
⤴️ 👆 🛠️ 🔜 🛠️ 🧾, & ☝ ⏪, 📨 ⏲ 📨 callback_url
( 🔢 🛠️):
https://www.external.org/events/invoices/2expen51ve
⏮️ 🎻 💪 ⚗ 🕳 💖:
{
"description": "Payment celebration",
"paid": true
}
& ⚫️ 🔜 ⌛ 📨 ⚪️➡️ 👈 🔢 🛠️ ⏮️ 🎻 💪 💖:
{
"ok": true
}
Tip
👀 ❔ ⏲ 📛 ⚙️ 🔌 📛 📨 🔢 🔢 callback_url
(https://www.external.org/events
) & 🧾 id
⚪️➡️ 🔘 🎻 💪 (2expen51ve
).
🚮 ⏲ 📻¶
👉 ☝ 👆 ✔️ ⏲ ➡ 🛠️(Ⓜ) 💪 (1️⃣(Ⓜ) 👈 🔢 👩💻 🔜 🛠️ 🔢 🛠️) ⏲ 📻 👆 ✍ 🔛.
🔜 ⚙️ 🔢 callbacks
👆 🛠️ ➡ 🛠️ 👨🎨 🚶♀️ 🔢 .routes
(👈 🤙 list
🛣/➡ 🛠️) ⚪️➡️ 👈 ⏲ 📻:
from typing import Union
from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Invoice(BaseModel):
id: str
title: Union[str, None] = None
customer: str
total: float
class InvoiceEvent(BaseModel):
description: str
paid: bool
class InvoiceEventReceived(BaseModel):
ok: bool
invoices_callback_router = APIRouter()
@invoices_callback_router.post(
"{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
pass
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
"""
Create an invoice.
This will (let's imagine) let the API user (some external developer) create an
invoice.
And this path operation will:
* Send the invoice to the client.
* Collect the money from the client.
* Send a notification back to the API user (the external developer), as a callback.
* At this point is that the API will somehow send a POST request to the
external API with the notification of the invoice event
(e.g. "payment successful").
"""
# Send the invoice, collect the money, send the notification (the callback)
return {"msg": "Invoice received"}
Tip
👀 👈 👆 🚫 🚶♀️ 📻 ⚫️ (invoices_callback_router
) callback=
, ✋️ 🔢 .routes
, invoices_callback_router.routes
.
✅ 🩺¶
🔜 👆 💪 ▶️ 👆 📱 ⏮️ Uvicorn & 🚶 http://127.0.0.1:8000/docs.
👆 🔜 👀 👆 🩺 ✅ "⏲" 📄 👆 ➡ 🛠️ 👈 🎦 ❔ 🔢 🛠️ 🔜 👀 💖: