{"id":4825,"date":"2025-08-26T13:19:02","date_gmt":"2025-08-26T13:19:02","guid":{"rendered":"https:\/\/uplatz.com\/blog\/?p=4825"},"modified":"2025-08-27T02:30:16","modified_gmt":"2025-08-27T02:30:16","slug":"fastapi-pocket-book","status":"publish","type":"post","link":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/","title":{"rendered":"FastAPI Pocket Book"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5-1024x576.png\" alt=\"FastAPI Pocket Book\" width=\"840\" height=\"473\" class=\"alignnone size-large wp-image-4837\" srcset=\"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5-1024x576.png 1024w, https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5-300x169.png 300w, https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5-768x432.png 768w, https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png 1280w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><br \/>\n<!-- FastAPI Pocket Book \u2014 Uplatz (50 Cards, Wide Layout, Readable Code, Scoped Styles) --><\/p>\n<div style=\"margin: 16px 0;\">\n<style>\n    .wp-fastapi-pb { font-family: Arial, sans-serif; max-width: 1320px; margin:0 auto; }\n    .wp-fastapi-pb .heading{\n      background: linear-gradient(135deg, #e0f2fe, #ccfbf1);\n      color:#0f172a; padding:22px 24px; border-radius:14px;\n      text-align:center; margin-bottom:18px; box-shadow:0 8px 20px rgba(0,0,0,.08);\n      border:1px solid #cbd5e1;\n    }\n    .wp-fastapi-pb .heading h2{ margin:0; font-size:2.1rem; letter-spacing:.2px; }\n    .wp-fastapi-pb .heading p{ margin:6px 0 0; font-size:1.02rem; opacity:.9; }<\/p>\n<p>    \/* Wide, dense grid *\/\n    .wp-fastapi-pb .grid{ display:grid; gap:14px; grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); }\n    @media (min-width:1200px){ .wp-fastapi-pb .grid{ grid-template-columns: repeat(3, 1fr); } }<\/p>\n<p>    .wp-fastapi-pb .section-title{ grid-column:1\/-1; background:#f8fafc; border-left:8px solid #0ea5e9; padding:12px 16px; border-radius:10px; font-weight:700; color:#0f172a; font-size:1.08rem; box-shadow:0 2px 8px rgba(0,0,0,.05); border:1px solid #e2e8f0; }\n    .wp-fastapi-pb .card{ background:#ffffff; border-left:6px solid #0ea5e9; padding:18px; border-radius:12px; box-shadow:0 6px 14px rgba(0,0,0,.06); transition:transform .12s ease, box-shadow .12s ease; border:1px solid #e5e7eb; }\n    .wp-fastapi-pb .card:hover{ transform: translateY(-3px); box-shadow:0 10px 22px rgba(0,0,0,.08); }\n    .wp-fastapi-pb .card h3{ margin:0 0 10px; font-size:1.12rem; color:#0f172a; }\n    .wp-fastapi-pb .card p{ margin:0; font-size:.96rem; color:#334155; line-height:1.62; }<\/p>\n<p>    \/* Color helpers *\/\n    .bg-blue { border-left-color:#0ea5e9 !important; background:#f0f9ff !important; }\n    .bg-green{ border-left-color:#10b981 !important; background:#f0fdf4 !important; }\n    .bg-amber{ border-left-color:#f59e0b !important; background:#fffbeb !important; }\n    .bg-violet{ border-left-color:#8b5cf6 !important; background:#f5f3ff !important; }\n    .bg-rose{ border-left-color:#ef4444 !important; background:#fff1f2 !important; }\n    .bg-cyan{ border-left-color:#06b6d4 !important; background:#ecfeff !important; }\n    .bg-lime{ border-left-color:#16a34a !important; background:#f0fdf4 !important; }\n    .bg-orange{ border-left-color:#f97316 !important; background:#fff7ed !important; }\n    .bg-indigo{ border-left-color:#6366f1 !important; background:#eef2ff !important; }\n    .bg-emerald{ border-left-color:#22c55e !important; background:#ecfdf5 !important; }\n    .bg-slate{ border-left-color:#334155 !important; background:#f8fafc !important; }<\/p>\n<p>    \/* Utilities *\/\n    .tight ul{ margin:0; padding-left:18px; }\n    .tight li{ margin:4px 0; }\n    .mono{ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }\n    .kbd{ background:#e5e7eb; border:1px solid #cbd5e1; padding:1px 6px; border-radius:6px; font-family:ui-monospace,monospace; font-size:.88em; }\n    .muted{ color:#64748b; }\n    .wp-fastapi-pb code{ background:#f1f5f9; padding:0 4px; border-radius:4px; border:1px solid #e2e8f0; }\n    .wp-fastapi-pb pre{ background:#f5f5f5; color:#111827; border:1px solid #e5e7eb; padding:12px; border-radius:8px; overflow:auto; font-size:.92rem; line-height:1.55; }\n    .q{font-weight:700;}\n    .qa p{ margin:8px 0; }\n    .qa b{ color:#0f172a; }\n  <\/style>\n<div class=\"wp-fastapi-pb\">\n<div class=\"heading\">\n<h2>FastAPI Pocket Book \u2014 Uplatz<\/h2>\n<p>    50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable Python snippets\n  <\/p><\/div>\n<div class=\"grid\">\n    <!-- ===================== SECTION 1 ===================== --><\/p>\n<div class=\"section-title\">Section 1 \u2014 Fundamentals<\/div>\n<div class=\"card bg-blue\">\n<h3>1) What is FastAPI?<\/h3>\n<p>      FastAPI is a modern, high\u2011performance web framework for building APIs with Python 3.8+ based on Starlette (ASGI) and Pydantic for data validation. It generates OpenAPI\/Swagger docs automatically and supports async\/await natively.<\/p>\n<pre><code class=\"mono\">pip install fastapi uvicorn[standard]\r\nuvicorn app:app --reload<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>2) Why FastAPI? Strengths &amp; Tradeoffs<\/h3>\n<p>      Strengths: automatic validation &amp; docs, excellent performance (uvicorn\/uvloop), type hints for DX, async support. Tradeoffs: less batteries\u2011included than Django; you must pick ORM, auth, and tooling. Keep conventions to avoid sprawl.<\/p>\n<pre><code class=\"mono\"># app.py\r\nfrom fastapi import FastAPI\r\napp = FastAPI()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>3) ASGI vs WSGI<\/h3>\n<p>      ASGI supports async concurrency, WebSockets, and background tasks. FastAPI apps run on ASGI servers (uvicorn, hypercorn). WSGI apps (Flask\/Django classic) are sync\u2011only without adapters.<\/p>\n<pre><code class=\"mono\">uvicorn app:app --workers 4 --http httptools --loop uvloop<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>4) Project Layout<\/h3>\n<p>      Organize by feature: <span class=\"mono\">app\/main.py<\/span>, <span class=\"mono\">app\/api\/routers<\/span>, <span class=\"mono\">app\/core<\/span>, <span class=\"mono\">app\/models<\/span>, <span class=\"mono\">app\/services<\/span>, <span class=\"mono\">tests<\/span>.<\/p>\n<pre><code class=\"mono\">app\/\r\n  main.py\r\n  api\/routers\/users.py\r\n  core\/config.py\r\n  db\/session.py<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>5) Path Operations<\/h3>\n<p>      Declare endpoints with Python type hints for params and responses.<\/p>\n<pre><code class=\"mono\">from fastapi import FastAPI\r\napp = FastAPI()\r\n@app.get('\/health')\r\nasync def health():\r\n    return { 'ok': True }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>6) Pydantic Models (v2\u2011style)<\/h3>\n<p>      Use Pydantic models for request\/response schemas; validation errors become JSON automatically.<\/p>\n<pre><code class=\"mono\">from pydantic import BaseModel\r\nclass UserIn(BaseModel):\r\n    email: str\r\n    name: str | None = None<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>7) Response Models<\/h3>\n<p>      Constrain output using <span class=\"mono\">response_model<\/span> to avoid leaking fields.<\/p>\n<pre><code class=\"mono\">class UserOut(BaseModel): id: int; email: str\r\n@app.post('\/users', response_model=UserOut)\r\nasync def create_user(u: UserIn): ...<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>8) Dependency Injection<\/h3>\n<p>      Reuse logic (DB sessions, auth) via <span class=\"mono\">Depends<\/span>. FastAPI resolves dependencies per\u2011request.<\/p>\n<pre><code class=\"mono\">from fastapi import Depends\r\nasync def get_settings(): return { 'debug': False }\r\n@app.get('\/cfg')\r\nasync def cfg(s = Depends(get_settings)): return s<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>9) Settings &amp; Env<\/h3>\n<p>      Use Pydantic <span class=\"mono\">BaseSettings<\/span> to read environment variables; fail fast if required keys are missing.<\/p>\n<pre><code class=\"mono\">from pydantic_settings import BaseSettings\r\nclass Settings(BaseSettings): DB_URL: str\r\nsettings = Settings()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>10) Q&amp;A \u2014 \u201cIs FastAPI production ready?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Yes, with proper deployment: ASGI server (uvicorn\/hypercorn), process manager (gunicorn), reverse proxy (nginx), observability, and a consistent architecture for auth\/database.\n    <\/div>\n<p>    <!-- ===================== SECTION 2 ===================== --><\/p>\n<div class=\"section-title\">Section 2 \u2014 Parameters, Bodies, Responses, Errors &amp; Middleware<\/div>\n<div class=\"card bg-blue\">\n<h3>11) Path &amp; Query Params<\/h3>\n<p>      Type hints define validation and docs. Use <span class=\"mono\">Path<\/span>, <span class=\"mono\">Query<\/span> for extra constraints.<\/p>\n<pre><code class=\"mono\">from fastapi import Path, Query\r\n@app.get('\/items\/{id}')\r\nasync def get_item(id: int = Path(gt=0), q: str | None = Query(None, max_length=50)): ...<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>12) Request Body &amp; Forms<\/h3>\n<p>      Use models for JSON; use <span class=\"mono\">Form<\/span> and <span class=\"mono\">UploadFile<\/span> for forms\/uploads.<\/p>\n<pre><code class=\"mono\">from fastapi import Form, UploadFile, File\r\n@app.post('\/login')\r\nasync def login(username: str = Form(), password: str = Form()): ...\r\n@app.post('\/avatar')\r\nasync def avatar(file: UploadFile = File(...)): ...<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>13) Response Types<\/h3>\n<p>      Return dicts, Pydantic models, or custom responses.<\/p>\n<pre><code class=\"mono\">from fastapi.responses import JSONResponse, PlainTextResponse\r\n@app.get('\/txt', response_class=PlainTextResponse)\r\nasync def txt(): return 'hello'<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>14) Exception Handling<\/h3>\n<p>      Raise <span class=\"mono\">HTTPException<\/span> or register handlers for custom errors.<\/p>\n<pre><code class=\"mono\">from fastapi import HTTPException\r\nif not found: raise HTTPException(status_code=404, detail='Not found')<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>15) Global Error Handler<\/h3>\n<p>      Customize error shapes and logging with exception handlers.<\/p>\n<pre><code class=\"mono\">from fastapi import Request\r\nfrom fastapi.responses import JSONResponse\r\n@app.exception_handler(Exception)\r\nasync def all_errors(_: Request, exc: Exception):\r\n    return JSONResponse({ 'error': str(exc) }, status_code=500)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>16) Middleware &amp; CORS<\/h3>\n<p>      Add middleware for timing, auth, or CORS.<\/p>\n<pre><code class=\"mono\">from starlette.middleware.cors import CORSMiddleware\r\napp.add_middleware(CORSMiddleware, allow_origins=['https:\/\/app.example.com'], allow_headers=['*'], allow_methods=['*'], allow_credentials=True)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>17) BackgroundTasks<\/h3>\n<p>      For small, non\u2011critical async work after the response. For heavy jobs, use Celery\/RQ.<\/p>\n<pre><code class=\"mono\">from fastapi import BackgroundTasks\r\n@app.post('\/email')\r\nasync def send_email(bt: BackgroundTasks):\r\n    bt.add_task(send_mail, 'hi')\r\n    return {'queued': True}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>18) Streaming &amp; SSE<\/h3>\n<p>      Stream large responses or use Server\u2011Sent Events.<\/p>\n<pre><code class=\"mono\">from starlette.responses import StreamingResponse\r\nasync def gen():\r\n    for i in range(5):\r\n        yield f\"data: {i}\\n\\n\"\r\n@app.get('\/sse')\r\nasync def sse(): return StreamingResponse(gen(), media_type='text\/event-stream')<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>19) WebSockets<\/h3>\n<p>      FastAPI exposes Starlette WebSocket routes.<\/p>\n<pre><code class=\"mono\">from fastapi import WebSocket\r\n@app.websocket('\/ws')\r\nasync def ws(ws: WebSocket):\r\n    await ws.accept(); await ws.send_text('hello'); await ws.close()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>20) Q&amp;A \u2014 \u201cBackgroundTasks vs Celery?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Use <b>BackgroundTasks<\/b> for tiny, best\u2011effort jobs tied to a request. Use Celery\/RQ\/Arq for durable, retryable, scheduled, or heavy workloads.\n    <\/div>\n<p>    <!-- ===================== SECTION 3 ===================== --><\/p>\n<div class=\"section-title\">Section 3 \u2014 Data, Auth, Caching &amp; Dependencies<\/div>\n<div class=\"card bg-blue\">\n<h3>21) SQLAlchemy \/ SQLModel<\/h3>\n<p>      Use SQLAlchemy 2.x or SQLModel for ORM. Manage sessions per\u2011request with dependencies and ensure proper cleanup.<\/p>\n<pre><code class=\"mono\">from sqlalchemy.orm import Session\r\nfrom .db import get_session\r\n@app.get('\/users')\r\nasync def list_users(db: Session = Depends(get_session)): ...<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>22) Database Session Pattern<\/h3>\n<p>      Create a dependency that yields a session and closes it at the end.<\/p>\n<pre><code class=\"mono\">from contextlib import contextmanager\r\n@contextmanager\r\ndef session_scope():\r\n    s = SessionLocal()\r\n    try: yield s; s.commit()\r\n    except: s.rollback(); raise\r\n    finally: s.close()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>23) NoSQL<\/h3>\n<p>      For MongoDB, use Motor (async) with a dependency that returns a client\/database; validate schemas with Pydantic models.<\/p>\n<pre><code class=\"mono\">from motor.motor_asyncio import AsyncIOMotorClient<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>24) Pagination<\/h3>\n<p>      Return <span class=\"mono\">items<\/span> + <span class=\"mono\">next<\/span>\/<span class=\"mono\">prev<\/span> cursors, not offset\/limit for large data. Document in OpenAPI.<\/p>\n<pre><code class=\"mono\">return { 'items': rows, 'next': next_cursor }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>25) OAuth2 &amp; JWT<\/h3>\n<p>      Implement password flow or auth code with OpenID Connect; issue short\u2011lived access tokens and rotate refresh tokens.<\/p>\n<pre><code class=\"mono\">from fastapi.security import OAuth2PasswordBearer\r\noauth2 = OAuth2PasswordBearer(tokenUrl='token')<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>26) Password Hashing<\/h3>\n<p>      Use Passlib (bcrypt\/argon2) and never store raw passwords.<\/p>\n<pre><code class=\"mono\">from passlib.context import CryptContext\r\npwd = CryptContext(schemes=['bcrypt'])<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>27) Authorization (RBAC)<\/h3>\n<p>      Create dependencies that enforce roles\/permissions; return 403 on failure.<\/p>\n<pre><code class=\"mono\">def require_role(role: str):\r\n    def dep(user=Depends(current_user)):\r\n        if role not in user.roles: raise HTTPException(403)\r\n        return user\r\n    return dep<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>28) Rate Limiting<\/h3>\n<p>      Use Starlette middleware or external gateways; store counters in Redis and return 429 with <span class=\"mono\">Retry\u2011After<\/span>.<\/p>\n<pre><code class=\"mono\"># e.g. slowapi or custom middleware with redis<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>29) Caching<\/h3>\n<p>      Cache hot reads in Redis with TTL; invalidate on writes. Include <span class=\"mono\">ETag<\/span>\/<span class=\"mono\">Cache\u2011Control<\/span> for HTTP caching.<\/p>\n<pre><code class=\"mono\">from fastapi import Response\r\nresp = Response(content, headers={'Cache-Control': 'public, max-age=60'})<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>30) Q&amp;A \u2014 \u201cWhere to put business logic?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Keep it in <b>services<\/b> (or <b>domain<\/b>) modules called by routers. Routers translate HTTP\u2194domain; services handle rules, DB, external APIs.\n    <\/div>\n<p>    <!-- ===================== SECTION 4 ===================== --><\/p>\n<div class=\"section-title\">Section 4 \u2014 Docs, Testing, Performance, Deployment &amp; Observability<\/div>\n<div class=\"card bg-blue\">\n<h3>31) OpenAPI &amp; Docs<\/h3>\n<p>      FastAPI generates Swagger UI and ReDoc automatically; customize metadata and tags.<\/p>\n<pre><code class=\"mono\">app = FastAPI(title='Shop API', version='1.0.0', openapi_tags=[{'name':'users'}])<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>32) Testing with httpx\/pytest<\/h3>\n<p>      Use <span class=\"mono\">httpx.AsyncClient<\/span> and FastAPI\u2019s <span class=\"mono\">lifespan<\/span> for startup\/shutdown.<\/p>\n<pre><code class=\"mono\">import pytest\r\nfrom httpx import AsyncClient\r\n@pytest.mark.asyncio\r\nasync def test_health():\r\n    async with AsyncClient(app=app, base_url='http:\/\/test') as ac:\r\n        r = await ac.get('\/health')\r\n        assert r.status_code == 200<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>33) Dependency Overrides in Tests<\/h3>\n<p>      Override <span class=\"mono\">Depends<\/span> providers for fakes\/mocks.<\/p>\n<pre><code class=\"mono\">app.dependency_overrides[get_session] = fake_session<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>34) Performance Tips<\/h3>\n<p>      Avoid blocking calls in async routes; use threadpools for CPU\u2011bound tasks; enable uvloop\/httptools; compress &amp; cache responses.<\/p>\n<pre><code class=\"mono\">import anyio\r\nresult = await anyio.to_thread.run_sync(cpu_heavy)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>35) Gunicorn + UvicornWorkers<\/h3>\n<p>      Run multiple worker processes under Gunicorn for multi\u2011core scaling.<\/p>\n<pre><code class=\"mono\">gunicorn app:app -k uvicorn.workers.UvicornWorker -w 4 -b 0.0.0.0:8000<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan\">\n<h3>36) Lifespan Events<\/h3>\n<p>      Initialize DB pools\/clients on startup and close at shutdown using the lifespan context.<\/p>\n<pre><code class=\"mono\">from contextlib import asynccontextmanager\r\n@asynccontextmanager\r\nasync def lifespan(app):\r\n    yield\r\napp = FastAPI(lifespan=lifespan)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-lime\">\n<h3>37) Security Headers<\/h3>\n<p>      Add CSP, HSTS, and other headers via middleware when serving pages; APIs typically set CORS, cache, and auth headers.<\/p>\n<pre><code class=\"mono\">from starlette.middleware import Middleware<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-orange\">\n<h3>38) Logging<\/h3>\n<p>      Structure logs (JSON), include request IDs, and capture exceptions. Configure uvicorn\/gunicorn log levels consistently.<\/p>\n<pre><code class=\"mono\">import logging, sys\r\nlogging.basicConfig(stream=sys.stdout, level=logging.INFO)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>39) Observability<\/h3>\n<p>      Export Prometheus metrics and OpenTelemetry traces; tag by route\/status for SLOs.<\/p>\n<pre><code class=\"mono\"># use prometheus-fastapi-instrumentator or custom middleware<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald\">\n<h3>40) Q&amp;A \u2014 \u201cHow many workers\/threads?\u201d<\/h3>\n<p>      <span class=\"q\">Answer:<\/span> Start with workers \u2248 CPU cores, keep threads low (async handles concurrency). Load test and adjust for latency\/SLOs; prefer horizontal scaling.\n    <\/div>\n<p>    <!-- ===================== SECTION 5 ===================== --><\/p>\n<div class=\"section-title\">Section 5 \u2014 Deployment, Security, Patterns, Pitfalls &amp; Interview Q&amp;A<\/div>\n<div class=\"card bg-blue\">\n<h3>41) Dockerfile<\/h3>\n<p>      Build slim images and pin Python versions.<\/p>\n<pre><code class=\"mono\">FROM python:3.12-slim\r\nWORKDIR \/app\r\nCOPY pyproject.toml requirements.txt .\/\r\nRUN pip install -r requirements.txt\r\nCOPY . .\r\nCMD [\"gunicorn\",\"app:app\",\"-k\",\"uvicorn.workers.UvicornWorker\",\"-w\",\"4\",\"-b\",\"0.0.0.0:8000\"]<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-green\">\n<h3>42) Health &amp; Readiness<\/h3>\n<p>      Provide <span class=\"mono\">\/health<\/span> (shallow) and <span class=\"mono\">\/ready<\/span> (checks DB\/queues) for orchestrators.<\/p>\n<pre><code class=\"mono\">@app.get('\/ready')\r\nasync def ready(): return {'db': 'ok', 'queue': 'ok'}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-amber\">\n<h3>43) Security Basics<\/h3>\n<p>      Validate inputs, limit body size, sanitize outputs, require HTTPS, rotate secrets, and enforce least privilege.<\/p>\n<pre><code class=\"mono\">from fastapi import Request\r\n@app.middleware('http')\r\nasync def size_limit(req: Request, call_next):\r\n    if int(req.headers.get('content-length', 0)) > 1_000_000:\r\n        return JSONResponse({'error': 'too large'}, 413)\r\n    return await call_next(req)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-violet\">\n<h3>44) File Upload Safety<\/h3>\n<p>      Validate filename\/content\u2011type, store outside web root, and scan untrusted files.<\/p>\n<pre><code class=\"mono\">dest = secure_path(filename)<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-rose\">\n<h3>45) Task Queues<\/h3>\n<p>      Offload slow\/retryable work to Celery\/RQ\/Arq; use idempotency keys and DLQs.<\/p>\n<pre><code class=\"mono\"># celery -A worker.celery worker -l info<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-cyan tight\">\n<h3>46) Production Checklist<\/h3>\n<ul>\n<li>Type\u2011hinted routers &amp; response models<\/li>\n<li>Dependency\u2011based DB\/session\/auth<\/li>\n<li>HTTP timeouts, rate limits, CORS<\/li>\n<li>Health\/ready endpoints; graceful shutdown<\/li>\n<li>Structured logs, metrics, tracing<\/li>\n<li>Load tests; autoscaling &amp; runbooks<\/li>\n<\/ul><\/div>\n<div class=\"card bg-lime\">\n<h3>47) Common Pitfalls<\/h3>\n<p>      Blocking calls in async routes, forgetting dependency overrides in tests, leaking DB sessions, not setting CORS\/HTTPS, and exposing sensitive fields by skipping <span class=\"mono\">response_model<\/span>.\n    <\/div>\n<div class=\"card bg-orange\">\n<h3>48) Example App Skeleton<\/h3>\n<p>      Split creation and running for testability.<\/p>\n<pre><code class=\"mono\"># app\/main.py\r\nfrom fastapi import FastAPI\r\nfrom .api.routers import users\r\n\r\ndef create_app() -> FastAPI:\r\n    app = FastAPI()\r\n    app.include_router(users.router, prefix='\/users', tags=['users'])\r\n    return app\r\n\r\napp = create_app()<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-indigo\">\n<h3>49) Versioning &amp; Deprecation<\/h3>\n<p>      Version via path (<span class=\"mono\">\/v1<\/span>) or headers; publish timelines and deprecation headers.<\/p>\n<pre><code class=\"mono\">from fastapi import Response\r\nResponse(headers={'Deprecation':'true','Sunset':'Wed, 31 Dec 2025 23:59:59 GMT'})<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card bg-emerald qa\">\n<h3>50) Interview Q&amp;A \u2014 20 Practical Questions (FastAPI\u2011focused)<\/h3>\n<p>      <b>1) Why FastAPI for microservices?<\/b> Strong typing, speed, and auto\u2011docs accelerate teams.<br \/>\n      <br \/><b>2) ASGI advantages?<\/b> Concurrency, WebSockets, streaming; works with uvicorn\/hypercorn.<br \/>\n      <br \/><b>3) Where to put DB session management?<\/b> In dependencies that yield\/close per request.<br \/>\n      <br \/><b>4) How to handle validation?<\/b> Pydantic models + type hints; errors are automatic.<br \/>\n      <br \/><b>5) Response model purpose?<\/b> Control output fields and docs; prevent data leaks.<br \/>\n      <br \/><b>6) Auth options?<\/b> OAuth2\/OIDC with JWT; cookie sessions for web apps via middleware.<br \/>\n      <br \/><b>7) Background tasks vs queues?<\/b> BackgroundTasks for quick follow\u2011ups; Celery for durable jobs.<br \/>\n      <br \/><b>8) Testing tools?<\/b> pytest + httpx AsyncClient; dependency overrides; fixtures for DB.<br \/>\n      <br \/><b>9) Performance levers?<\/b> uvloop\/httptools, caching, pagination, avoid blocking code.<br \/>\n      <br \/><b>10) CORS configuration?<\/b> CORSMiddleware with explicit origins\/headers.<br \/>\n      <br \/><b>11) OpenAPI customization?<\/b> Title, version, tags, and examples on models.<br \/>\n      <br \/><b>12) File uploads safely?<\/b> Validate type\/size, store outside root, scan.<br \/>\n      <br \/><b>13) Pagination pattern?<\/b> Cursor\u2011based for scale; include links\/tokens.<br \/>\n      <br \/><b>14) Observability stack?<\/b> Structured logs, Prometheus metrics, OpenTelemetry traces.<br \/>\n      <br \/><b>15) Deploy on k8s?<\/b> Gunicorn UvicornWorkers, readiness\/liveness probes, HPA by CPU\/latency.<br \/>\n      <br \/><b>16) Handle partial failures?<\/b> Timeouts, retries with backoff, circuit breakers.<br \/>\n      <br \/><b>17) Secure config?<\/b> BaseSettings + secret manager; do not commit secrets.<br \/>\n      <br \/><b>18) Prevent over\u2011fetch?<\/b> response_model + select only needed columns; paginate.<br \/>\n      <br \/><b>19) WebSockets auth?<\/b> Query tokens\/cookies at <span class=\"mono\">websocket.accept()<\/span>; validate before joining rooms.<br \/>\n      <br \/><b>20) When not to use FastAPI?<\/b> Heavy server\u2011side templating or complex admin UIs \u2014 consider Django.\n    <\/div>\n<\/p><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>FastAPI Pocket Book \u2014 Uplatz 50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable Python snippets Section 1 \u2014 Fundamentals 1) What is FastAPI? <span class=\"readmore\"><a href=\"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/\">Read More &#8230;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":4837,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2421,2462],"tags":[],"class_list":["post-4825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fastapi","category-pocket-book"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>FastAPI Pocket Book | Uplatz Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FastAPI Pocket Book | Uplatz Blog\" \/>\n<meta property=\"og:description\" content=\"FastAPI Pocket Book \u2014 Uplatz 50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable Python snippets Section 1 \u2014 Fundamentals 1) What is FastAPI? Read More ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/\" \/>\n<meta property=\"og:site_name\" content=\"Uplatz Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Uplatz-1077816825610769\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-26T13:19:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-27T02:30:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"uplatzblog\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@uplatz_global\" \/>\n<meta name=\"twitter:site\" content=\"@uplatz_global\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"uplatzblog\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/\"},\"author\":{\"name\":\"uplatzblog\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/person\\\/8ecae69a21d0757bdb2f776e67d2645e\"},\"headline\":\"FastAPI Pocket Book\",\"datePublished\":\"2025-08-26T13:19:02+00:00\",\"dateModified\":\"2025-08-27T02:30:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/\"},\"wordCount\":1118,\"publisher\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/5.png\",\"articleSection\":[\"FastAPI\",\"Pocket Book\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/\",\"name\":\"FastAPI Pocket Book | Uplatz Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/5.png\",\"datePublished\":\"2025-08-26T13:19:02+00:00\",\"dateModified\":\"2025-08-27T02:30:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#primaryimage\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/5.png\",\"contentUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/5.png\",\"width\":1280,\"height\":720,\"caption\":\"FastAPI Pocket Book\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/fastapi-pocket-book\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FastAPI Pocket Book\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\",\"name\":\"Uplatz Blog\",\"description\":\"Uplatz is a global IT Training &amp; Consulting company\",\"publisher\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\",\"name\":\"uplatz.com\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/Uplatz-Logo-Copy-2.png\",\"contentUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/Uplatz-Logo-Copy-2.png\",\"width\":1280,\"height\":800,\"caption\":\"uplatz.com\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Uplatz-1077816825610769\\\/\",\"https:\\\/\\\/x.com\\\/uplatz_global\",\"https:\\\/\\\/www.instagram.com\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/7956715?trk=tyah&amp;amp;amp;amp;trkInfo=clickedVertical:company,clickedEntityId:7956715,idx:1-1-1,tarId:1464353969447,tas:uplatz\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/person\\\/8ecae69a21d0757bdb2f776e67d2645e\",\"name\":\"uplatzblog\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"caption\":\"uplatzblog\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"FastAPI Pocket Book | Uplatz Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/","og_locale":"en_US","og_type":"article","og_title":"FastAPI Pocket Book | Uplatz Blog","og_description":"FastAPI Pocket Book \u2014 Uplatz 50 deep-dive flashcards \u2022 Wide layout \u2022 Fewer scrolls \u2022 20+ Interview Q&amp;A \u2022 Readable Python snippets Section 1 \u2014 Fundamentals 1) What is FastAPI? Read More ...","og_url":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/","og_site_name":"Uplatz Blog","article_publisher":"https:\/\/www.facebook.com\/Uplatz-1077816825610769\/","article_published_time":"2025-08-26T13:19:02+00:00","article_modified_time":"2025-08-27T02:30:16+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png","type":"image\/png"}],"author":"uplatzblog","twitter_card":"summary_large_image","twitter_creator":"@uplatz_global","twitter_site":"@uplatz_global","twitter_misc":{"Written by":"uplatzblog","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#article","isPartOf":{"@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/"},"author":{"name":"uplatzblog","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/person\/8ecae69a21d0757bdb2f776e67d2645e"},"headline":"FastAPI Pocket Book","datePublished":"2025-08-26T13:19:02+00:00","dateModified":"2025-08-27T02:30:16+00:00","mainEntityOfPage":{"@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/"},"wordCount":1118,"publisher":{"@id":"https:\/\/uplatz.com\/blog\/#organization"},"image":{"@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#primaryimage"},"thumbnailUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png","articleSection":["FastAPI","Pocket Book"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/","url":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/","name":"FastAPI Pocket Book | Uplatz Blog","isPartOf":{"@id":"https:\/\/uplatz.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#primaryimage"},"image":{"@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#primaryimage"},"thumbnailUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png","datePublished":"2025-08-26T13:19:02+00:00","dateModified":"2025-08-27T02:30:16+00:00","breadcrumb":{"@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#primaryimage","url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png","contentUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2025\/08\/5.png","width":1280,"height":720,"caption":"FastAPI Pocket Book"},{"@type":"BreadcrumbList","@id":"https:\/\/uplatz.com\/blog\/fastapi-pocket-book\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/uplatz.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FastAPI Pocket Book"}]},{"@type":"WebSite","@id":"https:\/\/uplatz.com\/blog\/#website","url":"https:\/\/uplatz.com\/blog\/","name":"Uplatz Blog","description":"Uplatz is a global IT Training &amp; Consulting company","publisher":{"@id":"https:\/\/uplatz.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/uplatz.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/uplatz.com\/blog\/#organization","name":"uplatz.com","url":"https:\/\/uplatz.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2016\/11\/Uplatz-Logo-Copy-2.png","contentUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2016\/11\/Uplatz-Logo-Copy-2.png","width":1280,"height":800,"caption":"uplatz.com"},"image":{"@id":"https:\/\/uplatz.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Uplatz-1077816825610769\/","https:\/\/x.com\/uplatz_global","https:\/\/www.instagram.com\/","https:\/\/www.linkedin.com\/company\/7956715?trk=tyah&amp;amp;amp;amp;trkInfo=clickedVertical:company,clickedEntityId:7956715,idx:1-1-1,tarId:1464353969447,tas:uplatz"]},{"@type":"Person","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/person\/8ecae69a21d0757bdb2f776e67d2645e","name":"uplatzblog","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","caption":"uplatzblog"}}]}},"_links":{"self":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/comments?post=4825"}],"version-history":[{"count":3,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4825\/revisions"}],"predecessor-version":[{"id":4860,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4825\/revisions\/4860"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/media\/4837"}],"wp:attachment":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/media?parent=4825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/categories?post=4825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/tags?post=4825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}