From 03ee860cebc7c62fc8ec64b6458010eac1110cea Mon Sep 17 00:00:00 2001 From: kennethreitz Date: Tue, 24 Mar 2026 20:01:17 +0000 Subject: [PATCH] deploy: 1c729c8542c1f9398deb65dbcd386080e6cf269e --- .doctrees/deployment.doctree | Bin 29159 -> 29465 bytes .doctrees/environment.pickle | Bin 238293 -> 241190 bytes .doctrees/quickstart.doctree | Bin 51654 -> 55130 bytes .doctrees/sandbox.doctree | Bin 6061 -> 8930 bytes .doctrees/tutorial-auth.doctree | Bin 18867 -> 24872 bytes .doctrees/tutorial-sqlalchemy.doctree | Bin 27233 -> 27887 bytes .doctrees/tutorial-websockets.doctree | Bin 18453 -> 24932 bytes _sources/deployment.rst.txt | 12 +++-- _sources/quickstart.rst.txt | 6 +++ _sources/sandbox.md.txt | 60 +++++++++++++++------ _sources/tutorial-auth.rst.txt | 57 +++++++++++++++++++- _sources/tutorial-sqlalchemy.rst.txt | 21 ++++---- _sources/tutorial-websockets.rst.txt | 52 ++++++++++++++++++- deployment.html | 12 +++-- index.html | 3 ++ quickstart.html | 6 +++ sandbox.html | 72 +++++++++++++++++++------- searchindex.js | 2 +- tutorial-auth.html | 57 +++++++++++++++++++- tutorial-sqlalchemy.html | 21 ++++---- tutorial-websockets.html | 53 +++++++++++++++++-- 21 files changed, 358 insertions(+), 76 deletions(-) diff --git a/.doctrees/deployment.doctree b/.doctrees/deployment.doctree index b4e65bf40d04140c7623e5a9eb2c04dcb348ef9a..69b83dfb1afd52a85f7c0d1733970d2f42f9bfe8 100644 GIT binary patch delta 3975 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 J!NGd#{{R|Etb+gm diff --git a/.doctrees/quickstart.doctree b/.doctrees/quickstart.doctree index 586a5ae621255982194b09b180b6d5200a810f8d..dc87414e678244ed231f3f03b7bcdee0e5df29de 100644 GIT binary patch delta 1826 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 delta 1713 zcma)7O=}ZD81CkS#%-+C*7Pgg%%-%BwI(Vm*pnYsk!VFdiAdROrp~VEZrt4|Eht?{*>pE)+Ng&lGw;0f%=0|&JCiTRmNVg- z;rmb8Uxsf7MtaUe3*aJpv7WeX@8fO*A|as>z`^gJA*5xIc#iguZ2dDSjjx?V8Lx>D4{of~15>VU0M zO;J`in4>5$iiA<>YsTh09UCpi>X4|owFVB7w~-#^TX%C!{ZzkxN6FRD2>Bgs#IW*5-&(RnjUFeJ#%?o&+zB41}tb= ztNu~h)u9T|YYH^z3fNu)RuLeQ$HA_a;xxnaTfz-)^MZb3ykX+b*NBVJDy-)iJ+2!Q zk_BYi27dRh4OV!5@OYNG>+>}5_&69Zqo#RxCL<_c0lRjMD^nm{A^-18U(pXUC!sCu zDsH8Bxs_y^l4CXc;v4Gg7|~_So&&d_K*AQ%4ch0v*18F#C3?WEiC9-_mZUbPhVr^> zX3Eb3SU1jLrI7a}yBqebORC*(*?@TZia@T8{}4J z>&m-M5b8SUU7Nt(gZ^u!J}L`oBS1)S56K}x;O5DgkPJQZ7Ul(!F1!-gQs{!8n)x1D^aw#Q*>R diff --git a/.doctrees/tutorial-auth.doctree b/.doctrees/tutorial-auth.doctree index 3ee57a196a9d79e72dbf7c8b09184801b55e5169..a921b51300fa91e0f60229c783c2c44ec357bad2 100644 GIT binary patch delta 4539 zcmcgwU2GIp6z`p;JVkz2E11;8uPzX&Fo4d1jcV;^~v&_9i zT})j_BnGk?;;bgdkQn6weK49nYK)PX@IWH*!55<_J`v&{CMLdl&YhjzDWpiTWgm7Y zch1~7_xry4opX2A4PE#u)O@1(tuFd$^Fxu)cWzhYiEx4lJ6kyD zI6|Gh8fgpNb!c;Fc6QCvarezw=g8Uvmcf#{DQ9UisH%)}GGv*;wv39l{76M>FW({J zROMu4rV`USa!rly;6S3Z3NAy94Gr2ltx@aLHfvqaUUX7gvd4>SF2AzJvdQ575l*Hx zW;2r3Ga2|b1#vjDInn5`;9!B-d7X3JGI@fqdyXW;V1yEl8NeM7L9`H}B~S6Zk}<(cKKvWJ!!+ToBE&rbvdW!m^9r zVr&?;byaYZDoWH9cuGEvb9)ku!Q(&}nV>@07^iT!WC;?LL?*}> zZ1EmBA3mgK0?(ONRoRfSmoSFl2VW&8a=81+&Tz})asv0{x@d_z8PLCuJ1nr7qBAnW zX2P*ekD#hX78$0}d^mw5?gvcG9untvb_GD$e)phw`xGSA?}`1}n%GCz9pYd@f>>ry z)ZjV+o9UQ8CLrK_(gO0|&!gP($pKo>73pZPXfI9Yb+Z@c#G?t4l7gMA3U(L%*2Eo^ zq0ye6Fly7#xtOGeF)1H)f9hXT%CodiL60v>L*d{f&nt>@WXAW4rFe0Gb@xVpYxlf4 z)S#d6p#Px;eMuPvyXUYe!TzBH;MO5&$JWhkwHzE{HrhTFP&w+RpIp#m0fI8V!*q^m zU1N?rHn3^S&-1axHj)vO6fFnr&Jo(AEIoZ;H%_9X;o6P|Iw9#@q(F;?MbipcLd^F7 z&)$1{7Va?NlM9=$2C0ycPW&=w4NO~)#he_el-FW*$rN@4Nh-U7q+0C?s1}8`pnGl* z@q$P-$UPccAG+wCjjbP9I|Lrekr`@|LBNBI3mY6STlANAhlqNWe7)XZoT-r^`-|&P zEgQi2Cn|*N`2v`#P{>}( zO3O+G+Y3aL6jsu^N|2$^krK$uGN2WKb|b8tg4rfD2nOiTIVoV?guPVIVSS)G;+QZe zMy&qawE~Q{Hi<3(Xz-xh$W|`RlZsoQhMm|$3+I`#td*dTyW^*Zb z0cq*TorfP_q`hn|2-*L;m{m$3rSpyMkB@F!aRbtM57Kc%$|G*RyR8KW&NaHF?lq;; z@%X;O2R*l_sXzd&&?ZX$$M+9%*;VGPlny(U779S{I2LPUH9@!)2Ja~nu2Q%?%?v{! z&sftY*VE9aA?YeLHwmcC$Dl(+pURVIU1-pk5?UfD!&0YEt+z?yexwH0IB#yZrWVV6 z2q4yW&#Jk|`PvBA;S4ZwWv)0b`{J1K#Ig8*Upw*6?T~j#%!BKy8_Q)+E5Cv?E(NuM z1D;k6d=QV11Lb%Ksrp3&iZHd-mFtF#I83<&1)6>uIAeY~Q`oRIv z&u5!9ZfNmpQ>7eARvay!dlwhz9gfkF&NRxilLp>m3r{@0%}R~c>P)rv;6_936`Yg- zCtEyBdj+Yg6z`-pSB-|1g)?!1W}!;?*w1~T<`u-Hd1HOMbvEH?cj7O(ZjWat6>L1z zYP*o6W)j<{B-AFaT?jNDeh~H)7=*`S86+Ez>$86he7~q1LA5JDM6Aa@(5R zFZVvSDfb#+pL-R*dT}@bUru?YN%Kq;3ykBx8Mz%zZu9Vlb{TtG#+`OFf_Gq+-r=pQ Sy$SGt4mklZIQ!!8q0qk&e9A85D%zoLcHPTtMS2%0JUH;IRF3v diff --git a/.doctrees/tutorial-sqlalchemy.doctree b/.doctrees/tutorial-sqlalchemy.doctree index b920ff66d782def5f1ad447a5e1e45f4e6b608b6..d4ac333d3df12b618cadd5d0bc6e3fb077396f7a 100644 GIT binary patch delta 3591 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 KFTApIx9~p^mjvbj delta 1002 zcmZvbTS${(7{~W~`@XF?EG5mHo0f;UlX;kjZ6zdW8bMoI9>UUwOul{K)Y3?@Qb=N8 zVm=!k2(cvT0GbZE2to@Z>8dX4CY8F8gz};w2zuXlP8oFbhxd7&|L^&~@AiFt1L08+ z283`z-KHqBzH{6E}nSFTEla8HP zL(q=?%y#^~zY0#^f$Rs6fFH7pla!oHCT56oQ7f87-Ej{l=LBFc4&;;x^`b^n;!AS2 zkWq_DGSOL$q{o)rd|pou_)%FRG_tXU+(%H2Ka4ivG&@h`9RoA2=M_LhoY{>oy^VLr z%x5;uY4}X4gO{`uIUIuz@7s%P~I7Ac7d)YArBP^5FX@~3EnFixCjpJ>n zAI8|83|9f%i!r$|Irh5@q(z{L2?8CIv!uUVOTf*sq>6{p@?ZB8SRe=;E_!URw1rrZ zW6`OLq(yT*rL(x~NWtHYP8g5WHZ5|ThL0pRt9j)*NhPhxF{?H08c&{B0xHj_Jf@OH z`zcheQn^g!8SJv+t%blwtkLSqwDE+6 str: payload = { "sub": user_id, - "exp": datetime.utcnow() + timedelta(hours=24), + "exp": datetime.now(timezone.utc) + timedelta(hours=24), } return jwt.encode(payload, SECRET, algorithm="HS256") @@ -189,3 +189,56 @@ Remember to set a proper secret key:: The session data is signed (not encrypted) — users can read it but can't tamper with it. Don't store sensitive data like passwords in sessions. + + +Role-Based Access Control +-------------------------- + +For APIs where different users have different permissions, embed the +role in the token and check it in route-specific guards:: + + def create_token(user_id: int, role: str = "user") -> str: + payload = { + "sub": user_id, + "role": role, + "exp": datetime.now(timezone.utc) + timedelta(hours=24), + } + return jwt.encode(payload, SECRET, algorithm="HS256") + +Create a helper that checks for a specific role:: + + def require_role(*roles): + """Before-request hook factory that restricts by role.""" + def check(req, resp): + user_role = getattr(req.state, "role", None) + if user_role not in roles: + resp.status_code = 403 + resp.media = {"error": "Insufficient permissions"} + return check + +Use it on specific routes:: + + @api.route("/admin/users", before_request=require_role("admin")) + def list_all_users(req, resp): + resp.media = {"users": [...]} + +And store the role during token verification:: + + # In your auth_guard: + req.state.user_id = payload["sub"] + req.state.role = payload.get("role", "user") + + +Choosing an Auth Strategy +-------------------------- + +- **API keys** — simplest. Good for server-to-server, CLI tools, and + internal services. No expiration unless you build it. +- **JWT tokens** — standard for SPAs and mobile apps. Stateless, so + they scale well. Downside: you can't revoke them without a blocklist. +- **Sessions** — best for traditional web apps with HTML forms. The + browser manages cookies automatically. Stateful — the server controls + the session lifecycle. + +Start with API keys for internal tools, JWT for public APIs, and +sessions for web apps with login pages. diff --git a/_sources/tutorial-sqlalchemy.rst.txt b/_sources/tutorial-sqlalchemy.rst.txt index 3bdcabd..237451e 100644 --- a/_sources/tutorial-sqlalchemy.rst.txt +++ b/_sources/tutorial-sqlalchemy.rst.txt @@ -28,8 +28,8 @@ SQLAlchemy models map Python classes to database tables. Each attribute becomes a column:: # models.py - from sqlalchemy import Column, Integer, String - from sqlalchemy.orm import DeclarativeBase + from sqlalchemy import String + from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass @@ -37,15 +37,16 @@ becomes a column:: class Book(Base): __tablename__ = "books" - id = Column(Integer, primary_key=True, autoincrement=True) - title = Column(String, nullable=False) - author = Column(String, nullable=False) - year = Column(Integer, nullable=False) - isbn = Column(String, nullable=True) + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + title: Mapped[str] = mapped_column(String, nullable=False) + author: Mapped[str] = mapped_column(String, nullable=False) + year: Mapped[int] = mapped_column(nullable=False) + isbn: Mapped[str | None] = mapped_column(String, nullable=True) -``DeclarativeBase`` is SQLAlchemy's modern base class (SQLAlchemy 2.0+). -Each model class corresponds to a table, and each ``Column`` corresponds -to a column in that table. +This uses SQLAlchemy 2.0's ``Mapped`` type annotations and +``mapped_column()``, which give you type checker support and cleaner +syntax than the older ``Column()`` style. Each model class corresponds +to a table, and each ``mapped_column()`` corresponds to a column. Database Setup diff --git a/_sources/tutorial-websockets.rst.txt b/_sources/tutorial-websockets.rst.txt index 62f17ae..35e5629 100644 --- a/_sources/tutorial-websockets.rst.txt +++ b/_sources/tutorial-websockets.rst.txt @@ -58,6 +58,8 @@ A chat room needs to broadcast messages to all connected clients. We keep a set of active connections and iterate through them when someone sends a message:: + from starlette.websockets import WebSocketDisconnect + connected = set() @api.route("/chat", websocket=True) @@ -70,13 +72,15 @@ a message:: # Broadcast to all connected clients for client in connected: await client.send_text(message) - except Exception: + except WebSocketDisconnect: pass finally: connected.discard(ws) The ``try/finally`` block ensures we remove disconnected clients from -the set, even if the connection drops unexpectedly. +the set, even if the connection drops unexpectedly. Catching +``WebSocketDisconnect`` specifically (rather than bare ``Exception``) +makes the intent clear and avoids swallowing real bugs. Data Formats @@ -154,6 +158,40 @@ WebSocket before-request hooks receive the ``ws`` object and must call ``await ws.accept()`` if they want the connection to proceed. +Connection Lifecycle +-------------------- + +WebSocket connections go through several states: + +1. **Connecting** — the client sends an upgrade request +2. **Open** — after ``await ws.accept()``, both sides can send messages +3. **Closing** — either side initiates a close handshake +4. **Closed** — the connection is fully terminated + +When a client disconnects (closes the tab, loses network), the next +``await ws.receive_text()`` raises ``WebSocketDisconnect``. Always +handle this — otherwise your server accumulates dead connections:: + + from starlette.websockets import WebSocketDisconnect + + @api.route("/ws", websocket=True) + async def handler(ws): + await ws.accept() + try: + while True: + data = await ws.receive_text() + await ws.send_text(f"Got: {data}") + except WebSocketDisconnect: + print("Client disconnected") + +You can also close connections from the server side:: + + await ws.close(code=1000) # 1000 = normal closure + +Common close codes: ``1000`` (normal), ``1001`` (going away), +``1008`` (policy violation), ``1011`` (server error). + + Testing WebSockets ------------------ @@ -169,3 +207,13 @@ Use Starlette's ``TestClient`` for WebSocket tests:: The ``websocket_connect`` context manager handles the connection lifecycle — it connects on enter and disconnects on exit. + +You can also test that connections are properly rejected:: + + from starlette.websockets import WebSocketDisconnect + + def test_websocket_404(): + client = TestClient(api) + with pytest.raises(WebSocketDisconnect): + with client.websocket_connect("/nonexistent"): + pass diff --git a/deployment.html b/deployment.html index ab84d3d..cb02a69 100644 --- a/deployment.html +++ b/deployment.html @@ -65,8 +65,9 @@ making a reverse proxy like nginx optional for many deployments.

Here’s a minimal Dockerfile:

FROM python:3.13-slim
 WORKDIR /app
+COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
 COPY . .
-RUN pip install responder
+RUN uv pip install --system responder
 ENV PORT=80
 EXPOSE 80
 CMD ["python", "api.py"]
@@ -78,9 +79,10 @@ $ docker run -p 8000:80 myapi
 

The python:3.13-slim image is about 150MB — small enough for fast -deploys but includes everything you need. For even smaller images, you -can use python:3.13-alpine, though some packages may need extra -build dependencies.

+deploys but includes everything you need. Using uv for installs +is significantly faster than pip. For even smaller images, you can use +python:3.13-alpine, though some packages may need extra build +dependencies.

Cloud Platforms

@@ -203,7 +205,7 @@ uvicorn directly without a reverse proxy and do just fine.

  • Add a health check/health endpoint for monitoring

  • Enable HTTPS — via your proxy, cloud platform, or uvicorn’s --ssl-* flags

  • Set up logging — uvicorn logs requests by default; pipe them to your log aggregator

  • -
  • Pin your dependencies — commit uv.lock for reproducible deploys

  • +
  • Pin your dependencies — use a lock file or pinned requirements for reproducible deploys

  • diff --git a/index.html b/index.html index e61e9fd..cb06178 100644 --- a/index.html +++ b/index.html @@ -245,6 +245,8 @@ work with — welcome.

  • Skipping Auth for Public Routes
  • Custom Exception for Auth Errors
  • Using Sessions for Web Apps
  • +
  • Role-Based Access Control
  • +
  • Choosing an Auth Strategy
  • WebSocket Tutorial
  • diff --git a/quickstart.html b/quickstart.html index 38de0f9..018cb91 100644 --- a/quickstart.html +++ b/quickstart.html @@ -385,6 +385,12 @@ jump into the tutorials:

  • Building a REST API — build a full CRUD API with validation

  • Using SQLAlchemy — connect to a database

  • Authentication — add authentication

  • +
  • WebSocket Tutorial — real-time communication

  • +
  • Writing Middleware — hooks and middleware

  • +
  • Migrating from Flask — migrating from Flask

  • +
  • Configuration — environment variables and secrets

  • +
  • Deployment — Docker, cloud platforms, and production

  • +
  • Testing — writing tests with pytest

  • diff --git a/sandbox.html b/sandbox.html index 9f4cbf6..7361e08 100644 --- a/sandbox.html +++ b/sandbox.html @@ -44,33 +44,63 @@

    Development Sandbox

    Setup

    -

    Set up a development sandbox.

    -

    Acquire sources and create virtualenv.

    +

    Clone the repo and install all dependencies:

    git clone https://github.com/kennethreitz/responder.git
     cd responder
    -uv venv
    -
    -
    -

    Install project in editable mode, including -all development tools.

    -
    uv pip install --upgrade --editable '.[develop,docs,release,test]'
    +uv venv && source .venv/bin/activate
    +uv pip install --upgrade --editable '.[develop,docs,release,test]'
     
    -
    -

    Operations

    -

    Run tests.

    -
    source .venv/bin/activate
    -pytest
    +
    +

    Running Tests

    +
    pytest                                  # full suite with coverage
    +pytest tests/test_responder.py -xvs     # single file, stop on first failure
    +pytest -k "test_mount"                  # run tests matching a pattern
     
    -

    Format code.

    -
    ruff format .
    -ruff check --fix .
    +
    +
    +

    Code Formatting

    +
    ruff format .        # auto-format
    +ruff check --fix .   # lint and auto-fix
     
    -

    Documentation authoring.

    -
    sphinx-autobuild --open-browser --watch docs/source docs/source docs/build
    +
    +
    +

    Type Checking

    +
    mypy
    +
    +
    +
    +
    +

    Documentation

    +

    Live-reloading doc server (opens in browser):

    +
    cd docs
    +sphinx-autobuild --open-browser --watch source source build
    +
    +
    +

    Or build once:

    +
    cd docs
    +make html
    +# open build/html/index.html
    +
    +
    +
    +
    +

    Project Layout

    +
    responder/
    +├── responder/          # main package
    +│   ├── api.py          # API class — the entry point
    +│   ├── routes.py       # Router, Route, WebSocketRoute
    +│   ├── models.py       # Request and Response wrappers
    +│   ├── ext/            # extensions (CLI, GraphQL, OpenAPI, rate limiting)
    +│   ├── background.py   # background task queue
    +│   └── formats.py      # content negotiation (JSON, YAML, msgpack)
    +├── tests/              # pytest test suite
    +├── examples/           # runnable example apps
    +├── docs/source/        # Sphinx documentation
    +└── pyproject.toml      # project metadata and tool config
     
    @@ -103,7 +133,11 @@ ruff check --fix < diff --git a/searchindex.js b/searchindex.js index 33e3db3..2fddd87 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles":{"API Key Authentication":[[11,"api-key-authentication"]],"API Reference":[[0,null]],"Added":[[2,"added"],[2,"id2"],[2,"id4"],[2,"id7"],[2,"id11"],[2,"id17"],[2,"id18"],[2,"id21"],[2,"id24"],[2,"id29"],[2,"id36"],[2,"id42"],[2,"id43"],[2,"id44"],[2,"id45"],[2,"id46"],[2,"id49"],[2,"id50"],[2,"id52"],[2,"id55"],[2,"id58"],[2,"id59"],[2,"id60"],[2,"id64"]],"Adding Third-Party Middleware":[[13,"adding-third-party-middleware"]],"After-Request Hooks":[[10,"after-request-hooks"]],"Allowed Hosts":[[5,"allowed-hosts"]],"Authentication":[[11,null]],"Background Queue":[[0,"background-queue"]],"Background Tasks":[[7,"background-tasks"]],"Backlog":[[1,null]],"Bearer Token Authentication":[[11,"bearer-token-authentication"]],"Before-Request Hooks":[[10,"before-request-hooks"]],"Before-Request Hooks for WebSockets":[[16,"before-request-hooks-for-websockets"]],"Blueprints \u2192 Route Groups":[[12,"blueprints-route-groups"]],"Building Frontend Assets":[[3,"building-frontend-assets"]],"Building a REST API":[[14,null]],"Built-in Middleware":[[13,"built-in-middleware"]],"CORS":[[10,"cors"]],"CRUD Endpoints":[[15,"crud-endpoints"]],"Changed":[[2,"changed"],[2,"id1"],[2,"id3"],[2,"id5"],[2,"id8"],[2,"id16"],[2,"id19"],[2,"id22"],[2,"id25"],[2,"id28"],[2,"id33"],[2,"id34"],[2,"id35"],[2,"id37"],[2,"id38"],[2,"id40"],[2,"id41"],[2,"id47"],[2,"id51"],[2,"id56"],[2,"id57"],[2,"id63"]],"Changelog":[[2,null]],"Chat Room":[[16,"chat-room"]],"Class-Based Views":[[10,"class-based-views"]],"Cloud Platforms":[[4,"cloud-platforms"]],"Command Line Interface":[[3,null]],"Configuration":[[5,null]],"Configuration Class Pattern":[[5,"configuration-class-pattern"]],"Content Negotiation":[[10,"content-negotiation"]],"Cookie-Based Sessions":[[10,"cookie-based-sessions"]],"Cookies":[[10,"cookies"]],"Create a Book":[[14,"create-a-book"]],"Create a Web Service":[[7,"create-a-web-service"]],"Custom Error Handling":[[10,"custom-error-handling"]],"Custom Exception for Auth Errors":[[11,"custom-exception-for-auth-errors"]],"Custom Instance Names":[[3,"custom-instance-names"]],"Data Formats":[[16,"data-formats"]],"Database Setup":[[15,"database-setup"]],"Debug Mode":[[5,"debug-mode"]],"Define Your Models":[[14,"define-your-models"],[15,"define-your-models"]],"Delete a Book":[[14,"delete-a-book"]],"Deployment":[[4,null]],"Deprecated":[[2,"deprecated"]],"Development Sandbox":[[8,null]],"Docker":[[4,"docker"]],"Docker Compose":[[4,"docker-compose"]],"Echo Server":[[16,"echo-server"]],"Environment Variables":[[3,"environment-variables"],[5,"environment-variables"]],"Error Handling":[[14,"error-handling"]],"Feature Tour":[[10,null]],"Fixed":[[2,"fixed"],[2,"id6"],[2,"id10"],[2,"id12"],[2,"id13"],[2,"id14"],[2,"id15"],[2,"id20"],[2,"id23"],[2,"id26"],[2,"id27"],[2,"id30"],[2,"id31"],[2,"id32"],[2,"id39"],[2,"id48"],[2,"id53"],[2,"id54"],[2,"id61"],[2,"id62"]],"Future Ideas":[[1,"future-ideas"]],"Get a Single Book":[[14,"get-a-single-book"]],"Getting Started":[[9,"getting-started"]],"Gradual Migration":[[12,"gradual-migration"]],"GraphQL":[[10,"graphql"]],"HSTS":[[10,"hsts"]],"HTML Client":[[16,"html-client"]],"Health Check Endpoint":[[4,"health-check-endpoint"]],"Hello World":[[7,"hello-world"]],"Hooks vs. Middleware":[[13,"hooks-vs-middleware"]],"How WebSockets Work":[[16,"how-websockets-work"]],"In-Memory Storage":[[14,"in-memory-storage"]],"Installation":[[6,"installation"],[15,"installation"]],"JSON APIs":[[12,"json-apis"]],"Launching from a File":[[3,"launching-from-a-file"]],"Launching from a Module":[[3,"launching-from-a-module"]],"Launching from a URL":[[3,"launching-from-a-url"]],"Lifespan Events":[[10,"lifespan-events"]],"Lifespan for Startup and Shutdown":[[15,"lifespan-for-startup-and-shutdown"]],"List All Books":[[14,"list-all-books"]],"MessagePack":[[10,"messagepack"]],"Method Filtering":[[10,"method-filtering"]],"Middleware Order":[[13,"middleware-order"]],"Migrating from Flask":[[12,null]],"Mounting Other Apps":[[10,"mounting-other-apps"]],"OpenAPI Documentation":[[10,"openapi-documentation"]],"Operations":[[8,"operations"]],"Production Checklist":[[4,"production-checklist"]],"Project":[[6,null]],"Project Setup":[[14,"project-setup"]],"Putting It All Together":[[5,"putting-it-all-together"],[7,"putting-it-all-together"]],"Pydantic Validation":[[10,"pydantic-validation"]],"Query Dict":[[0,"query-dict"]],"Quick Reference":[[12,"quick-reference"]],"Quick Start":[[7,null]],"Rate Limiter":[[0,"rate-limiter"]],"Rate Limiting":[[10,"rate-limiting"]],"Reading Requests":[[7,"reading-requests"]],"Removed":[[2,"removed"],[2,"id9"]],"Rendering Templates":[[7,"rendering-templates"]],"Request":[[0,"request"]],"Request ID":[[10,"request-id"]],"Responder":[[6,null]],"Response":[[0,"response"]],"Reverse Proxy":[[4,"reverse-proxy"]],"Route Groups":[[0,"route-groups"],[10,"route-groups"]],"Route Parameters":[[7,"route-parameters"],[12,"route-parameters"]],"Run It":[[14,"run-it"],[15,"run-it"]],"Run the Server":[[7,"run-the-server"]],"Running Locally":[[4,"running-locally"]],"Secret Key":[[5,"secret-key"]],"Sending Responses":[[7,"sending-responses"]],"Server-Sent Events (SSE)":[[10,"server-sent-events-sse"]],"Serving Files":[[10,"serving-files"]],"Setup":[[8,"setup"]],"Skipping Auth for Public Routes":[[11,"skipping-auth-for-public-routes"]],"Static Files":[[10,"static-files"]],"Status Code Helpers":[[0,"status-code-helpers"]],"Templates":[[12,"templates"]],"Testing":[[9,null]],"Testing Before and After Hooks":[[9,"testing-before-and-after-hooks"]],"Testing Error Handling":[[9,"testing-error-handling"]],"Testing File Uploads":[[9,"testing-file-uploads"]],"Testing Headers and Cookies":[[9,"testing-headers-and-cookies"]],"Testing JSON APIs":[[9,"testing-json-apis"]],"Testing Lifespan Events":[[9,"testing-lifespan-events"]],"Testing Mounted Apps":[[9,"testing-mounted-apps"]],"Testing Rate Limiting":[[9,"testing-rate-limiting"]],"Testing Request Validation":[[9,"testing-request-validation"]],"Testing WebSockets":[[9,"testing-websockets"],[16,"testing-websockets"]],"The API Class":[[0,"the-api-class"]],"The Big Differences":[[12,"the-big-differences"]],"The Idea":[[6,"the-idea"]],"Tips":[[9,"tips"],[15,"tips"]],"Trusted Hosts":[[10,"trusted-hosts"]],"Try It Out":[[14,"try-it-out"]],"Tutorials":[[6,null]],"Type Convertors":[[7,"type-convertors"]],"Update a Book":[[14,"update-a-book"]],"User Guide":[[6,null]],"Using .env Files":[[5,"using-env-files"]],"Using Fixtures":[[9,"using-fixtures"]],"Using PostgreSQL":[[15,"using-postgresql"]],"Using SQLAlchemy":[[15,null]],"Using Sessions for Web Apps":[[11,"using-sessions-for-web-apps"]],"Using Starlette Middleware":[[13,"using-starlette-middleware"]],"Uvicorn Directly":[[4,"uvicorn-directly"]],"WebSocket Support":[[10,"websocket-support"]],"WebSocket Tutorial":[[16,null]],"What You Get":[[6,"what-you-get"]],"What\u2019s Next":[[14,"what-s-next"]],"When to Use What":[[13,"when-to-use-what"]],"Writing Middleware":[[13,null]],"Writing Pure ASGI Middleware":[[13,"writing-pure-asgi-middleware"]],"v0.0.1 - 2018-10-12":[[2,"v0-0-1-2018-10-12"]],"v0.0.10 - 2018-10-17":[[2,"v0-0-10-2018-10-17"]],"v0.0.2 - 2018-10-13":[[2,"v0-0-2-2018-10-13"]],"v0.0.3 - 2018-10-13":[[2,"v0-0-3-2018-10-13"]],"v0.0.4 - 2018-10-15":[[2,"v0-0-4-2018-10-15"]],"v0.0.5 - 2018-10-15":[[2,"v0-0-5-2018-10-15"]],"v0.0.6 - 2018-10-16":[[2,"v0-0-6-2018-10-16"]],"v0.0.7 - 2018-10-16":[[2,"v0-0-7-2018-10-16"]],"v0.0.8 - 2018-10-17":[[2,"v0-0-8-2018-10-17"]],"v0.0.9 - 2018-10-17":[[2,"v0-0-9-2018-10-17"]],"v0.1.0 - 2018-10-17":[[2,"v0-1-0-2018-10-17"]],"v0.1.1 - 2018-10-17":[[2,"v0-1-1-2018-10-17"]],"v0.1.2 - 2018-10-18":[[2,"v0-1-2-2018-10-18"]],"v0.1.3 - 2018-10-18":[[2,"v0-1-3-2018-10-18"]],"v0.1.4 - 2018-10-19":[[2,"v0-1-4-2018-10-19"]],"v0.1.5 - 2018-10-20":[[2,"v0-1-5-2018-10-20"]],"v0.1.6 - 2018-10-20":[[2,"v0-1-6-2018-10-20"]],"v0.2.0 - 2018-10-22":[[2,"v0-2-0-2018-10-22"]],"v0.2.1 - 2018-10-23":[[2,"v0-2-1-2018-10-23"]],"v0.2.2 - 2018-10-23":[[2,"v0-2-2-2018-10-23"]],"v0.2.3 - 2018-10-24":[[2,"v0-2-3-2018-10-24"]],"v0.3.0 - 2018-10-24":[[2,"v0-3-0-2018-10-24"]],"v0.3.1 - 2018-10-24":[[2,"v0-3-1-2018-10-24"]],"v0.3.2 - 2018-10-25":[[2,"v0-3-2-2018-10-25"]],"v0.3.3 - 2018-10-25":[[2,"v0-3-3-2018-10-25"]],"v1.0.0 - 2018-10-26":[[2,"v1-0-0-2018-10-26"]],"v1.0.1 - 2018-10-26":[[2,"v1-0-1-2018-10-26"]],"v1.0.2 - 2018-10-27":[[2,"v1-0-2-2018-10-27"]],"v1.0.3 - 2018-10-27":[[2,"v1-0-3-2018-10-27"]],"v1.0.4 - 2018-10-27":[[2,"v1-0-4-2018-10-27"]],"v1.0.5- 2018-10-27":[[2,"v1-0-5-2018-10-27"]],"v1.1.0 - 2018-10-27":[[2,"v1-1-0-2018-10-27"]],"v1.1.1 - 2018-10-29":[[2,"v1-1-1-2018-10-29"]],"v1.1.2 - 2018-11-11":[[2,"v1-1-2-2018-11-11"]],"v1.1.3 - 2019-01-12":[[2,"v1-1-3-2019-01-12"]],"v1.2.0 - 2018-12-29":[[2,"v1-2-0-2018-12-29"]],"v1.3.0 - 2019-02-22":[[2,"v1-3-0-2019-02-22"]],"v1.3.1 - 2019-04-28":[[2,"v1-3-1-2019-04-28"]],"v1.3.2 - 2019-08-15":[[2,"v1-3-2-2019-08-15"]],"v2.0.0 - 2019-09-19":[[2,"v2-0-0-2019-09-19"]],"v2.0.1 - 2019-09-20":[[2,"v2-0-1-2019-09-20"]],"v2.0.2 - 2019-09-20":[[2,"v2-0-2-2019-09-20"]],"v2.0.3 - 2019-09-20":[[2,"v2-0-3-2019-09-20"]],"v2.0.4 - 2019-11-19":[[2,"v2-0-4-2019-11-19"]],"v2.0.5 - 2019-12-15":[[2,"v2-0-5-2019-12-15"]],"v3.0.0 - 2026-03-22":[[2,"v3-0-0-2026-03-22"]],"v3.2.0 - 2026-03-22":[[2,"v3-2-0-2026-03-22"]],"v3.3.0 - 2026-03-22":[[2,"v3-3-0-2026-03-22"]],"v3.4.0 - 2026-03-22":[[2,"v3-4-0-2026-03-22"]],"v3.5.0 - 2026-03-24":[[2,"v3-5-0-2026-03-24"]]},"docnames":["api","backlog","changes","cli","deployment","guide-config","index","quickstart","sandbox","testing","tour","tutorial-auth","tutorial-flask","tutorial-middleware","tutorial-rest","tutorial-sqlalchemy","tutorial-websockets"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1},"filenames":["api.rst","backlog.md","changes.md","cli.rst","deployment.rst","guide-config.rst","index.rst","quickstart.rst","sandbox.md","testing.rst","tour.rst","tutorial-auth.rst","tutorial-flask.rst","tutorial-middleware.rst","tutorial-rest.rst","tutorial-sqlalchemy.rst","tutorial-websockets.rst"],"indexentries":{"accepts() (responder.request method)":[[0,"responder.Request.accepts",false]],"add_event_handler() (responder.api method)":[[0,"responder.API.add_event_handler",false]],"add_middleware() (responder.api method)":[[0,"responder.API.add_middleware",false]],"add_route() (responder.api method)":[[0,"responder.API.add_route",false]],"after_request() (responder.api method)":[[0,"responder.API.after_request",false]],"api (class in responder)":[[0,"responder.API",false]],"apparent_encoding (responder.request property)":[[0,"responder.Request.apparent_encoding",false]],"backgroundqueue (class in responder.background)":[[0,"responder.background.BackgroundQueue",false]],"before_request() (responder.api method)":[[0,"responder.API.before_request",false]],"check() (responder.ext.ratelimit.ratelimiter method)":[[0,"responder.ext.ratelimit.RateLimiter.check",false]],"client (responder.request property)":[[0,"responder.Request.client",false]],"content (responder.request property)":[[0,"responder.Request.content",false]],"cookies (responder.request property)":[[0,"responder.Request.cookies",false]],"encoding (responder.request property)":[[0,"responder.Request.encoding",false]],"exception_handler() (responder.api method)":[[0,"responder.API.exception_handler",false]],"file() (responder.response method)":[[0,"responder.Response.file",false]],"full_url (responder.request property)":[[0,"responder.Request.full_url",false]],"get() (responder.models.querydict method)":[[0,"responder.models.QueryDict.get",false]],"get_list() (responder.models.querydict method)":[[0,"responder.models.QueryDict.get_list",false]],"graphql() (responder.api method)":[[0,"responder.API.graphql",false]],"group() (responder.api method)":[[0,"responder.API.group",false]],"headers (responder.request property)":[[0,"responder.Request.headers",false]],"install() (responder.ext.ratelimit.ratelimiter method)":[[0,"responder.ext.ratelimit.RateLimiter.install",false]],"is_100() (in module responder.status_codes)":[[0,"responder.status_codes.is_100",false]],"is_200() (in module responder.status_codes)":[[0,"responder.status_codes.is_200",false]],"is_300() (in module responder.status_codes)":[[0,"responder.status_codes.is_300",false]],"is_400() (in module responder.status_codes)":[[0,"responder.status_codes.is_400",false]],"is_500() (in module responder.status_codes)":[[0,"responder.status_codes.is_500",false]],"is_json (responder.request property)":[[0,"responder.Request.is_json",false]],"is_secure (responder.request property)":[[0,"responder.Request.is_secure",false]],"items() (responder.models.querydict method)":[[0,"responder.models.QueryDict.items",false]],"items_list() (responder.models.querydict method)":[[0,"responder.models.QueryDict.items_list",false]],"media() (responder.request method)":[[0,"responder.Request.media",false]],"method (responder.request property)":[[0,"responder.Request.method",false]],"mimetype (responder.request property)":[[0,"responder.Request.mimetype",false]],"module":[[0,"module-responder",false]],"mount() (responder.api method)":[[0,"responder.API.mount",false]],"ok (responder.response property)":[[0,"responder.Response.ok",false]],"on_event() (responder.api method)":[[0,"responder.API.on_event",false]],"params (responder.request property)":[[0,"responder.Request.params",false]],"path_matches_route() (responder.api method)":[[0,"responder.API.path_matches_route",false]],"path_params (responder.request property)":[[0,"responder.Request.path_params",false]],"querydict (class in responder.models)":[[0,"responder.models.QueryDict",false]],"ratelimiter (class in responder.ext.ratelimit)":[[0,"responder.ext.ratelimit.RateLimiter",false]],"redirect() (responder.api method)":[[0,"responder.API.redirect",false]],"redirect() (responder.response method)":[[0,"responder.Response.redirect",false]],"request (class in responder)":[[0,"responder.Request",false]],"requests (responder.api property)":[[0,"responder.API.requests",false]],"responder":[[0,"module-responder",false]],"response (class in responder)":[[0,"responder.Response",false]],"route() (responder.api method)":[[0,"responder.API.route",false]],"routegroup (class in responder.api)":[[0,"responder.api.RouteGroup",false]],"run() (responder.api method)":[[0,"responder.API.run",false]],"run() (responder.background.backgroundqueue method)":[[0,"responder.background.BackgroundQueue.run",false]],"schema() (responder.api method)":[[0,"responder.API.schema",false]],"serve() (responder.api method)":[[0,"responder.API.serve",false]],"session (responder.request property)":[[0,"responder.Request.session",false]],"session() (responder.api method)":[[0,"responder.API.session",false]],"set_cookie() (responder.response method)":[[0,"responder.Response.set_cookie",false]],"sse() (responder.response method)":[[0,"responder.Response.sse",false]],"state (responder.request property)":[[0,"responder.Request.state",false]],"static_app (responder.api property)":[[0,"responder.API.static_app",false]],"status_code_safe (responder.response property)":[[0,"responder.Response.status_code_safe",false]],"stream() (responder.response method)":[[0,"responder.Response.stream",false]],"stream_file() (responder.response method)":[[0,"responder.Response.stream_file",false]],"task() (responder.background.backgroundqueue method)":[[0,"responder.background.BackgroundQueue.task",false]],"template() (responder.api method)":[[0,"responder.API.template",false]],"template_string() (responder.api method)":[[0,"responder.API.template_string",false]],"text (responder.request property)":[[0,"responder.Request.text",false]],"url (responder.request property)":[[0,"responder.Request.url",false]],"url_for() (responder.api method)":[[0,"responder.API.url_for",false]]},"objects":{"":[[0,0,0,"-","responder"]],"responder":[[0,1,1,"","API"],[0,1,1,"","Request"],[0,1,1,"","Response"]],"responder.API":[[0,2,1,"","add_event_handler"],[0,2,1,"","add_middleware"],[0,2,1,"","add_route"],[0,2,1,"","after_request"],[0,2,1,"","before_request"],[0,2,1,"","exception_handler"],[0,2,1,"","graphql"],[0,2,1,"","group"],[0,2,1,"","mount"],[0,2,1,"","on_event"],[0,2,1,"","path_matches_route"],[0,2,1,"","redirect"],[0,3,1,"","requests"],[0,2,1,"","route"],[0,2,1,"","run"],[0,2,1,"","schema"],[0,2,1,"","serve"],[0,2,1,"","session"],[0,3,1,"","static_app"],[0,2,1,"","template"],[0,2,1,"","template_string"],[0,2,1,"","url_for"]],"responder.Request":[[0,2,1,"","accepts"],[0,3,1,"","apparent_encoding"],[0,3,1,"","client"],[0,3,1,"","content"],[0,3,1,"","cookies"],[0,3,1,"","encoding"],[0,3,1,"","full_url"],[0,3,1,"","headers"],[0,3,1,"","is_json"],[0,3,1,"","is_secure"],[0,2,1,"","media"],[0,3,1,"","method"],[0,3,1,"","mimetype"],[0,3,1,"","params"],[0,3,1,"","path_params"],[0,3,1,"","session"],[0,3,1,"","state"],[0,3,1,"","text"],[0,3,1,"","url"]],"responder.Response":[[0,2,1,"","file"],[0,3,1,"","ok"],[0,2,1,"","redirect"],[0,2,1,"","set_cookie"],[0,2,1,"","sse"],[0,3,1,"","status_code_safe"],[0,2,1,"","stream"],[0,2,1,"","stream_file"]],"responder.api":[[0,1,1,"","RouteGroup"]],"responder.background":[[0,1,1,"","BackgroundQueue"]],"responder.background.BackgroundQueue":[[0,2,1,"","run"],[0,2,1,"","task"]],"responder.ext.ratelimit":[[0,1,1,"","RateLimiter"]],"responder.ext.ratelimit.RateLimiter":[[0,2,1,"","check"],[0,2,1,"","install"]],"responder.models":[[0,1,1,"","QueryDict"]],"responder.models.QueryDict":[[0,2,1,"","get"],[0,2,1,"","get_list"],[0,2,1,"","items"],[0,2,1,"","items_list"]],"responder.status_codes":[[0,4,1,"","is_100"],[0,4,1,"","is_200"],[0,4,1,"","is_300"],[0,4,1,"","is_400"],[0,4,1,"","is_500"]]},"objnames":{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","property","Python property"],"4":["py","function","Python function"]},"objtypes":{"0":"py:module","1":"py:class","2":"py:method","3":"py:property","4":"py:function"},"terms":{"":[0,2,3,4,5,6,7,9,10,11,12,13,15,16],"0":[0,3,4,5,7,10,14,15],"00":0,"01":0,"0441172719":14,"1":[0,1,3,4,5,7,9,10,11,12,14,16],"10":[0,6,7,10],"100":[0,2,10],"127":[3,4,5],"13":4,"14":2,"150mb":4,"16":4,"1965":14,"2":[0,1,4,7,9,10,14,15,16],"200":[0,4,7,9,10,14],"201":[0,7,9,12,14,15],"2026":0,"204":[14,15],"24":11,"2xx":0,"3":[0,1,4,6,7,9,10,14,16],"30":4,"3000":5,"301":[0,7],"308":2,"32":5,"3600":[0,10],"3f":13,"4":[4,7],"40":2,"400":[0,2,9,10,14],"401":[0,10,11],"404":[0,7,12,14,15],"41d4":7,"422":[2,9,10,14],"429":[0,9,10],"446655440000":7,"500":[2,7,9,10,13,14],"5000":10,"5042":[3,4,7,10,11,14,16],"550e8400":7,"561":2,"60":[0,2,9,10],"600":[0,10],"7":[9,11],"8":0,"80":4,"8000":[4,7],"8192":0,"9":9,"978":14,"99":9,"A":[0,4,5,6,7,10,13,16],"And":[5,6,7],"As":[0,10],"But":[7,9,10],"By":[3,7,9,10,13,14],"For":[0,3,4,5,7,9,10,11,13,14,15],"If":[0,3,5,6,7,9,10,12,15],"In":[0,5,6,7,10,11,12,15,16],"It":[0,3,6,9,10,13],"No":[6,9,10,12,14],"Not":7,"On":[5,10],"One":[6,7,9],"Or":[0,5],"That":[4,6,7,9],"The":[2,3,4,5,7,9,10,11,13,14,15,16],"There":[9,10],"These":7,"To":[14,15],"Will":0,"With":[0,5],"_":9,"__call__":13,"__init__":[11,13],"__main__":[4,6,7,9,14,15],"__name__":[4,6,7,9,10,12,14,15],"__tablename__":15,"_route_for":2,"a2wsgi":2,"a716":7,"abc":14,"abc123":[0,9,10,11],"abil":2,"abl":0,"abort":12,"about":[4,7,9,12],"abov":[6,11],"abstract":[13,15],"accept":[0,1,2,7,9,10,16],"access":[0,2,4,10,11,13,15],"acm":3,"acquir":8,"across":[2,4,10,15],"activ":[8,16],"actual":[0,4,7,10],"ad":[0,6,10],"adapt":10,"add":[0,2,4,5,7,11,13,14,15,16],"add_event_handl":0,"add_head":[10,13],"add_middlewar":[0,13],"add_request_id":0,"add_rout":[0,10],"add_tim":[9,10],"add_vers":9,"addeventlisten":16,"addit":[0,13],"address":[0,5,7,10],"adher":2,"admin":11,"affect":10,"after":[0,6,7,11,15,16],"after_request":[0,2,9,10,13],"ag":[0,10],"again":11,"against":[0,4,10,11],"aggreg":4,"agre":7,"ahead":2,"ai":10,"aiosqlit":15,"alemb":15,"algorithm":11,"alias":2,"alic":10,"aliv":4,"all":[0,2,3,4,6,8,9,10,12,13,15,16],"alloc":9,"allow":[4,6,10],"allow_credenti":[0,10],"allow_head":[0,10],"allow_method":[0,5,10],"allow_origin":[0,5,10],"allow_origin_regex":0,"allowed_host":[0,5,9,10],"alongsid":10,"alpin":4,"alreadi":[0,9,10],"also":[0,2,3,7,9,10],"altern":[0,10],"alwai":[4,5,6,7,10],"an":[0,3,4,5,7,10,12,13,14,15,16],"analysi":10,"angle_bracket":12,"angular":10,"ani":[0,3,4,5,6,7,9,10,11,13,14,15,16],"annot":[2,6,7,10],"annual":[7,10],"answer":[10,16],"anyon":6,"anyth":7,"anywher":[4,10],"api":[2,3,4,5,6,7,10,13,15,16],"api_kei":11,"api_v1":12,"apispec":2,"app":[0,2,3,4,5,6,7,12,13,14,15,16],"appar":0,"apparent_encod":0,"appear":[0,10],"appendchild":16,"appli":[0,13],"applic":[0,2,3,4,5,7,9,10,11,13,14,15],"approach":[5,10,11,12,13],"appropri":[10,15],"ar":[0,2,3,4,6,7,9,10,11,12,13,15,16],"architectur":10,"aren":[7,13],"arg":[0,12],"argument":[0,2,7,12,13],"around":[0,6],"arriv":[7,12],"asgi":[0,2,4,6,7,10,12],"ask":[6,10,16],"assert":[9,16],"asset":[0,4,6,10],"assign":14,"associ":0,"async":[0,2,4,6,7,9,10,11,12,13,14,15,16],"async_sess":15,"async_sessionmak":15,"asynccontextmanag":[10,15],"asynchron":[2,4],"asyncio":[2,15],"asyncpg":[4,15],"attach":10,"attack":[4,5,10],"attribut":[0,3,15],"audio":16,"auth":[2,6,10,13],"auth_check":10,"auth_guard":11,"authent":[6,7,10,13,16],"autherror":11,"author":[0,7,8,10,11,13,14,15],"auto":[0,2,10,16],"auto_escap":0,"autobuild":8,"autoincr":15,"automat":[0,2,3,4,5,6,7,9,10,11,12,13,14,15],"avail":[0,7,10],"avoid":[9,10,13],"aw":4,"await":[0,2,7,9,10,11,12,13,14,15,16],"azur":[3,4],"b":[0,7,9,13,15,16],"back":[0,7,10,15,16],"background":[2,6],"backgroundqueu":0,"backlog":6,"bad":[9,10,14],"balanc":4,"bandwidth":10,"bar":10,"bare":2,"base":[0,2,6,11,13,15],"base_url":0,"basehttpmiddlewar":13,"basemodel":[0,9,10,14,15],"basic":7,"batteri":6,"battl":6,"bearer":6,"becaus":[0,6,7,11,12,14],"becom":[0,15],"been":0,"befor":[0,1,2,4,6,7,11,13,15],"before_request":[0,1,2,9,10,11,12,13,16],"begin":15,"behav":0,"behavior":[5,13],"behind":[4,10],"being":[0,10],"best":6,"better":6,"between":13,"bidirect":[10,16],"big":6,"biggest":12,"bin":8,"binari":[7,10,16],"bind":[0,3,4,5,7],"blob":3,"block":[0,7,9,10,12,16],"blueprint":6,"bodi":[0,2,7,9,10,12,14,16],"boilerpl":6,"book":[6,15],"book_id":[14,15],"bookin":[14,15],"bookout":15,"books_db":14,"bool":5,"born":6,"both":[6,7,10,12,16],"bottom":14,"boundari":10,"box":13,"bp":12,"break":[2,9],"bring":6,"broad":2,"broadcast":16,"broke":[7,9],"broker":7,"browser":[7,8,10,11,14,16],"bucket":[0,10],"buffer":[0,7],"bufix":2,"bug":[2,9],"bugfix":2,"build":[2,4,6,7,8,10,11,15,16],"builder":15,"built":[1,2,4,6,7,9,10,16],"bump":2,"bypass":[4,13],"byte":[0,2,6,7,13,16],"c":[5,16],"cach":[7,9,10],"caddi":4,"caddyfil":4,"call":[2,3,7,9,10,13,14,16],"call_next":13,"callabl":[0,13],"came":7,"can":[0,2,3,4,5,7,9,10,11,12,13,14,15,16],"carri":7,"case":[0,6,7,13],"cat":10,"catalog":14,"catch":[10,11,13],"categori":0,"cd":8,"ceas":2,"celeri":7,"cell":10,"central":[0,7],"certain":0,"certif":4,"chang":[0,15],"changelog":6,"channel":[10,16],"chardet":0,"chat":[2,6,10],"check":[0,6,8,9,10,11,13,16],"check_api_kei":11,"check_auth":0,"check_exist":[0,10,14,15],"checklist":6,"choic":[7,10],"choos":10,"chunk":[0,10],"chunk_siz":0,"ci":2,"circuit":[0,1,2,10],"class":[2,6,7,9,11,13,14,15],"clean":[6,10,14],"cleaner":[10,11],"cleanli":5,"cleanup":[2,10],"clear":11,"cli":2,"click":6,"client":[0,2,6,7,9,10,11,14],"clone":8,"close":[9,10,15,16],"close_database_connection_pool":0,"cloud":[3,5,6,7],"cmd":4,"code":[2,3,4,5,6,7,8,9,10,11,14,15,16],"codebas":2,"coercion":10,"collabor":[10,16],"colon":3,"column":15,"com":[0,3,4,5,7,8,10],"combin":7,"come":[7,10,12],"command":[4,6],"commit":[4,5,15],"common":[0,3,4,5,7,10,11,12,13,14],"commonli":7,"commun":[10,11],"compact":10,"compat":[0,2],"complement":10,"complet":[7,10,14,16],"complex":[13,15],"compon":13,"compos":[6,15],"comprehens":2,"compress":[6,7,13],"compromis":5,"comput":7,"concept":[2,10,12],"concern":[7,13],"concurr":[0,4],"condit":[9,10],"config":[4,5,15],"configur":[0,2,4,6,7,9,10,13],"confirm":4,"conflict":2,"confus":9,"conn":15,"connect":[0,4,7,9,10,13,15,16],"consid":[7,15],"consist":[7,10],"consol":[10,15],"const":[10,16],"constructor":[0,13],"consum":10,"contact":0,"contain":[0,4,7],"container":4,"content":[0,2,6,7,9,13,14],"content_typ":[0,9,10],"context":[1,2,6,9,10,15,16],"contextlib":[10,15],"continu":7,"contract":9,"control":[0,4,5,7,10,11,13,15],"conveni":[0,5,15],"convent":[3,4,14],"convert":[2,7],"convertor":[2,6,12],"cooki":[0,2,5,6,7,11,12,13],"copi":4,"cor":[0,2,5,6,9,13],"core":[2,4],"coroutin":0,"correctli":4,"correspond":15,"cors_en":5,"cors_origin":5,"cors_param":[0,5,10],"corsmiddlewar":13,"count":2,"cover":[5,11,13],"coverag":2,"cpu":[0,4,7],"crash":2,"creat":[0,6,8,9,10,11,12,15],"create_al":15,"create_asgi_app":10,"create_async_engin":15,"create_book":[14,15],"create_connect":16,"create_item":[0,10,12],"create_pet":10,"create_token":11,"createel":16,"creation":[13,15],"credenti":11,"cross":[10,13],"crud":[6,7,14],"css":10,"csv":[0,10],"curl":[3,4,7,10,11,14],"curly_brac":12,"custom":[0,2,6,7,9,14,16],"cut":13,"cycl":7,"d":[7,9,14],"dashboard":[5,10,11,16],"data":[0,2,4,5,6,7,9,10,11,12,14,15],"databas":[4,5,6,7,9,10,11,14],"database_url":[4,5,15],"date":0,"datetim":11,"db":[4,5,15],"debug":[0,2,4,6,10,12],"decim":7,"declar":[2,7],"declarativebas":15,"decod":[2,10,11],"decor":[0,2,7,10],"deep":6,"def":[0,4,6,7,9,10,11,12,13,14,15,16],"def456":11,"default":[0,2,3,4,5,7,9,10,15],"default_valu":[0,10],"defend":10,"defin":[0,6,7,10,11],"definit":0,"del":14,"delet":[5,6,7,10,15],"delete_book":[14,15],"deliber":7,"demo":3,"deni":13,"denpend":2,"dep":2,"depend":[2,4,9,13],"depends_on":4,"deploi":[4,6],"deploy":[2,6],"depth":10,"describ":10,"descript":[0,10],"design":[7,10,14],"detail":[4,5,10,14],"detect":[0,6,10],"dev":[2,4,5],"develop":[3,4,5,10,15],"devic":10,"dict":[6,7,10,11,14,15],"dictionari":0,"differ":[0,1,3,5,6,9,10,15],"digit":7,"direct":[0,2,10,13],"directli":[3,6,7,9,10,14,15],"directori":[0,7,10],"disabl":[4,9,15],"discard":16,"disconnect":16,"disk":[0,7,10],"dispatch":[2,10,13],"dispos":15,"distribut":[4,10],"div":16,"django":[6,10],"do":[4,5,7,10],"doc":[0,2,8,9,10,11,14],"docker":[5,6],"dockerfil":4,"docs_rout":[0,10,14],"docstr":[2,10],"doctyp":16,"document":[0,2,4,6,8,14,16],"doe":15,"doesn":[0,10,14,15],"domain":[0,4,5,10],"don":[4,5,7,9,10,11,12,15],"done":4,"dot":3,"dotenv":5,"doubl":14,"down":[10,15],"download":10,"dramat":2,"driver":15,"drop":[2,16],"dump":2,"dune":14,"duplex":10,"duplic":10,"durat":13,"dure":[3,4,9,15],"duti":14,"dynam":7,"e":[0,16],"e29b":7,"each":[0,4,9,10,15],"easi":[3,5,7],"echo":[6,7,15],"ecosystem":[6,7],"edit":8,"editor":[10,16],"effect":[9,14],"effici":4,"either":[0,16],"element":[0,10],"els":[7,10,11,12,15],"email":7,"emb":10,"empti":[0,14],"enabl":[0,2,4,10,13,14],"enable_async":7,"enable_hst":[0,10,13],"encod":[0,2,11],"encrypt":11,"end":[7,14],"endpoint":[0,1,2,6,9,10,11,12,14],"enforc":10,"engin":[7,15],"enough":[4,13],"ensur":[10,14,15,16],"enter":[9,16],"entir":[0,4,10,11,13,14],"entiti":10,"entri":14,"env":[4,6],"environ":[0,4,6,7],"eol":2,"equival":12,"error":[0,2,5,6,15],"errorhandl":12,"escap":0,"essenti":10,"establish":16,"etc":[7,9,10],"even":[3,4,10,16],"event":[0,2,6,7,12,16],"event_typ":0,"eventsourc":10,"ever":[5,6],"everi":[0,4,5,6,7,9,10,11,13,14,15],"everyth":[0,2,4,7,10,12,14,15,16],"everywher":[3,5],"evolv":15,"exact":2,"exactli":[9,10],"exampl":[0,2,3,4,5,7,10,11],"exc":[0,9,10,11,14],"exceed":[0,10],"except":[0,2,6,9,10,13,16],"exception_cl":0,"exception_handl":[0,2,9,10,11,12,14],"exceptionmiddlewar":13,"execut":15,"exist":[0,2,6,12,13],"exit":[4,9,10,16],"exp":11,"expand":2,"expect":7,"expens":4,"expir":[0,10,11],"expire_on_commit":15,"explain":10,"explan":0,"explicit":[7,10,12],"explicitli":[10,12],"explor":[7,10],"export":[0,5,10],"expos":[4,5],"expose_head":0,"express":[6,7],"ext":[0,2,9,10,15],"extens":[2,7],"extern":7,"extra":[2,4,10,13],"extract":0,"extrem":7,"f":[0,4,6,7,9,10,11,13,14,16],"factori":15,"fail":[9,10,15],"failur":[2,9],"falcon":[6,10],"fall":0,"fals":[0,4,5,9,10,14,15],"familiar":[6,12],"fast":[4,6,7,9],"fastapi":6,"faster":[10,13],"featur":[0,6,7],"feed":10,"feel":6,"fetch":3,"few":12,"fido":10,"field":[0,2,9,10,14],"figur":7,"file":[0,2,4,6,7,14,15,16],"filenam":[0,9],"filepath":7,"filesystem":[2,3],"fill":7,"filter":[6,7],"final":16,"find":[3,10,12],"fine":[4,10,13,15],"fire":[0,9],"first":[0,9,10,11,13,14,15],"fit":6,"fix":8,"fixtur":6,"flag":[4,10,15],"flask":[2,6,9,10],"flask_app":[9,10,12],"flatten":2,"float":[0,7,9,10],"flow":[11,13],"fly":[3,4],"fmt":2,"follow":7,"font":10,"forg":[5,10],"forget":0,"form":[0,7,11,12],"format":[0,2,6,7,8,10,11],"formerli":10,"forward":[4,10],"found":[2,7,14,15],"foundat":10,"fragment":3,"frame":13,"framework":[6,10],"franca":7,"frank":14,"free":2,"freeli":16,"fresh":9,"from":[0,2,4,5,6,7,9,10,11,13,14,15,16],"from_attribut":15,"front":4,"frontend":[6,10],"fsspec":3,"full":[0,2,3,7,10],"full_url":[0,7,10],"fulli":7,"fun":6,"func":0,"function":[0,7,10,12,13],"futur":[0,2,6],"g":0,"game":[10,16],"gatewai":4,"gener":[0,2,5,6,9,10,13,14],"get":[0,2,5,7,10,11,15],"get_book":[14,15],"get_list":0,"get_m":11,"get_us":[0,10,12],"getelementbyid":16,"getenv":5,"getlist":0,"git":[5,8],"github":[2,3,8],"gitignor":5,"give":[0,9,10,13,15],"given":[0,9],"global":[12,14],"gmt":0,"go":[4,7,12],"goe":[10,12],"good":[4,6,10],"googl":[3,4],"grace":4,"grade":7,"gradual":[6,10],"graduat":13,"grain":15,"graphen":[0,2,6,10],"graphiql":[2,6,10],"graphql":[0,2,6],"great":[3,6,10],"greet":[6,7,10],"greet_world":6,"greetingresourc":10,"group":[2,6],"grow":10,"guard":11,"guid":[2,5,7,11,12,15],"guido":7,"gzip":[6,7],"gzipmiddlewar":13,"h":[7,10,11,14],"h1":[0,7,11],"ha":[7,9,12,14,16],"half":7,"halv":10,"hand":0,"handl":[0,2,4,5,6,7,11,13,16],"handle_auth_error":11,"handle_value_error":[0,10,14],"handler":[0,6,9,10,11,13,14],"handshak":16,"happen":[6,7,10],"hard":9,"hasn":0,"have":[0,2,3,7,9,12,13,14],"hdf":3,"head":3,"header":[0,2,4,5,6,7,10,11,12,13,16],"health":[6,11],"healthcheck":4,"healthi":4,"heavi":7,"hello":[0,3,6,9,10,12,16],"hello_html":7,"hello_json":7,"hello_to":7,"hello_world":7,"helloworld":3,"help":[0,15],"helper":[6,11],"herbert":14,"here":[4,5,7,10,12,16],"heroku":[3,4],"high":[4,10],"hold":[0,6,7],"home":6,"homepag":2,"honor":[4,7],"hood":10,"hook":[0,2,6,7,11],"host":[0,2,4,6,7,9,13],"hostnam":10,"hour":[10,11],"how":[3,5,6,7,10,11,12,14,15],"hs256":11,"hst":6,"html":[0,2,6,7,10,11,12],"http":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16],"httponli":[0,10],"httpsredirect":0,"httpsredirectmiddlewar":[0,4,13],"httpx":[2,9],"i":[0,2,3,4,5,6,7,9,10,11,12,13,14,15,16],"id":[0,2,6,7,12,13,14,15,16],"idea":12,"idempot":14,"ident":12,"identifi":10,"imag":[4,7,10,16],"immedi":[0,6,7,10],"immut":2,"imperson":5,"implement":9,"import":[0,2,3,5,6,7,9,10,11,12,13,14,15,16],"improv":2,"inaccess":0,"includ":[3,4,6,7,8,9,10,11,14],"incom":[0,7,10,14],"incredibli":10,"independ":4,"index":[0,7,10,16],"individu":10,"industri":10,"info":[0,2,10],"inform":[0,14],"infrastructur":[4,6],"inherit":[0,10],"initi":[0,9],"inject":[3,10,13],"innermost":13,"input":[2,9,10,14,16],"insensit":[0,6,7],"insid":13,"inspect":[0,2],"instal":[0,2,3,4,5,8,9,10,11,16],"instanc":[0,4,6,7,9],"instant":7,"instantli":4,"instead":[0,7,9,10,13,14,15,16],"instruct":4,"int":[0,2,7,10,11,12,14,15],"integ":[0,7,14,15],"integr":[10,13,14,15],"intens":7,"intent":6,"intention":10,"interact":[2,10,14],"interfac":[2,4,6,7,12],"intern":[9,10,13],"interv":4,"invalid":[5,9,10,11],"invalidtokenerror":11,"involv":0,"io":[3,4],"iot":10,"ip":[0,7,10],"is_100":0,"is_200":0,"is_300":0,"is_400":0,"is_500":0,"is_class_bas":2,"is_http":0,"is_json":[0,2,7],"is_secur":[0,7],"isbn":[14,15],"iscoroutinefunct":2,"isn":[7,10,12],"issu":[2,11],"item":[0,9,10,12,15],"itemin":[0,10],"itemout":[0,10],"items_list":0,"iter":16,"its":[0,2,4,14,15],"itself":11,"j":10,"jan":0,"javascript":[0,3,10],"jinja2":[0,7,12],"jpeg":10,"jpg":10,"json":[0,3,6,7,10,11,14,16],"jsonifi":12,"jump":7,"just":[4,9,10,13,15,16],"jwt":11,"keep":[2,4,5,7,9,10,13,15,16],"kei":[0,4,6,7,9,10,12,15,16],"kennethreitz":[3,8],"keypress":16,"keyword":[0,7,12,13],"know":[5,7],"known":[0,11],"kubernet":4,"kwarg":0,"languag":10,"larg":[0,2,10],"larger":[5,9,13],"last":[0,13],"later":[7,9],"launch":[4,6],"layer":13,"lazi":2,"lazili":0,"lead":9,"learn":10,"legaci":12,"less":10,"let":[3,4,7,10,14,15],"level":[4,13],"lib":4,"librari":[9,10,16],"licens":0,"lifecycl":16,"lifespan":[0,2,6,14],"lift":7,"lightn":4,"lightweight":[4,7],"like":[0,3,4,7,9,10,11,13,14,16],"limit":[1,2,4,6,13,15,16],"line":[6,7],"liner":2,"lingua":7,"list":[0,6,7,9,10,13,15],"list_book":[14,15],"list_item":10,"list_pet":10,"list_us":[0,10,12],"list_users_v2":10,"listen":3,"live":[4,10,16],"ll":[6,7,10,12,14,15],"load":[0,2,3,4,5,7,10],"load_dotenv":5,"local":[3,5,6,12],"localhost":[4,5,7,9,10,11,14,15,16],"locat":[0,7,11,12],"lock":4,"log":[1,4,6,10,11,13],"log_error":0,"log_level":2,"log_request":13,"log_respons":10,"logic":[6,7,10],"login":[10,11],"logout":11,"long":7,"look":[3,4,6,7],"loop":[7,12,16],"lose":[2,15],"lower":[0,5],"lowercas":7,"machin":10,"made":[0,6],"magic":12,"mai":4,"main":3,"make":[4,5,7,9,10,11,12],"malici":10,"manag":[2,5,6,9,10,11,13,15,16],"mani":[0,4,7,10],"manual":0,"map":[2,7,10,12,15],"mapper":15,"marimo":[2,10],"mark":[2,10],"marker":2,"marshmallow":[0,2,10],"match":[0,5,7,10,14],"matter":10,"max_ag":[0,10],"maximum":[0,13],"me":[0,11],"mean":[4,7,10,12],"mechan":10,"media":[0,2,4,6,7,9,10,11,12,14,15],"memori":[0,2,6,7,10],"messag":[0,7,10,11,13,16],"messagepack":[2,6],"metadata":[0,7,15],"method":[0,6,7,9,11,12,13,14,15,16],"microservic":10,"middelwar":0,"middlewar":[0,2,6,7,10],"middleware_cl":0,"middleware_config":0,"might":7,"migrat":[2,6,10,15],"mime":0,"mimetyp":[0,7,10],"min":[0,10],"mind":13,"minim":[4,16],"minimum":2,"minor":2,"miss":[2,9,10,11],"mix":10,"ml":10,"mode":[0,4,6,8],"model":[0,2,6,9,10],"model_dump":15,"model_valid":15,"modern":[4,10,11,12,15],"modifi":[0,10,13,14,15],"modul":[0,2,6,7,10],"monitor":4,"more":[0,3,4,7,10,11,12,13,14,16],"most":[0,3,4,5,7,9,10,11,13,15],"mount":[0,2,6,12],"move":[2,7,10,12],"msgpack":[2,10],"much":[7,10],"multi":0,"multipart":[2,7],"multipl":[0,2,4,10,14],"multiplay":[10,16],"must":[0,7,10,11,14,16],"mutabl":6,"mutat":[0,7,12],"my":0,"my_templ":7,"myapi":4,"myapp":[3,4],"mydb":15,"mysql":15,"n":[0,7],"name":[0,4,5,6,7,9,10,12],"namespac":2,"narrow":2,"nativ":12,"natur":[9,15],"nearli":12,"need":[4,5,6,7,9,10,11,12,13,15,16],"negoti":[0,6,7,9],"nervou":7,"network":9,"never":[4,5,10,11,14],"new":[0,7,9,10,12,14,16],"new_endpoint":12,"next":[6,13],"next_id":14,"nginx":4,"non":7,"none":[0,2,11,14,15],"normal":[0,10,16],"nosniff":13,"notabl":2,"notasecret":0,"note":[7,10,12,14],"notebook":[2,10],"notic":7,"notif":10,"now":[2,7,10,11,15,16],"npm":3,"nullabl":15,"number":[0,7],"o":[0,3,5,7,12],"object":[0,2,7,10,12,13,15,16],"objecttyp":[0,10],"obviou":9,"octet":0,"off":[5,7],"offload":4,"offset":15,"often":[3,7,10],"ok":[0,7,9,14],"old":12,"omit":4,"on_delet":10,"on_ev":[0,9,10],"on_get":[6,10],"on_post":[6,10],"on_put":10,"on_request":[6,10],"on_startup":9,"onc":[10,12,14],"one":[0,2,5,6,7,10,12,15],"ones":[6,7,10],"onion":13,"onli":[0,5,7,10,12,14],"onmessag":[10,16],"open":[2,7,8,15],"open_database_connection_pool":0,"openapi":[0,1,2,6,14],"openapi_rout":0,"openapi_them":0,"oper":[7,10,12,14],"opt":10,"option":[0,2,4,6,7,13],"option1":13,"option2":13,"orchestr":4,"order":[0,6],"order_bi":15,"organ":[0,5,9,10,12],"origin":[10,13],"orm":15,"other":[0,2,3,4,6,7,15],"otherwis":[0,10],"our":14,"out":[5,6,7,13],"outermost":13,"outgo":[7,10],"output":14,"outsid":13,"over":[0,6,7,10,12,15],"overal":2,"overhead":[9,13],"overrid":[0,10],"overwhelm":10,"own":[4,10,15],"p":[4,11,16],"pace":10,"packag":[2,3,4],"page":[0,2,5,7,10,11,16],"pagin":7,"painless":9,"pair":0,"param":[0,2,6,7,12],"paramet":[0,6,9,10,14],"parameter":0,"pars":[0,2,7,9,10],"parser":2,"part":[2,6,7,10],"parti":6,"pass":[0,3,4,7,9,10,12,13,15,16],"passion":6,"password":11,"patch":[7,10],"path":[0,2,3,6,7,9,10,11,13],"path_matches_rout":0,"path_param":[0,2,7],"pattern":[0,4,6,7,10,11,12,13,14,15],"payload":11,"pdf":[0,7,9,10],"pep":2,"per":[0,1,4,9,10],"perfect":10,"perfectli":13,"perform":13,"period":[0,2,9,10],"perman":7,"permit":10,"persist":[0,10,16],"person":6,"pet":[0,10],"petin":10,"petout":10,"petschema":[0,10],"pgdata":4,"photo":10,"piec":10,"pin":[2,4],"pip":[2,3,4,5,6,8,11,15,16],"pipe":4,"place":[5,10],"placehold":[7,16],"plain":[0,7,10,13,16],"platform":[2,3,5,6,7],"pleasant":6,"plot":10,"plu":15,"plugin":2,"poethepoet":2,"point":[3,4,14],"polici":[10,13],"poll":4,"pool":[0,6,7,10,12,15],"popular":[7,10,15],"port":[0,3,4,5,7,9],"portion":0,"possibl":7,"post":[0,5,7,9,10,11,12,14,15],"postgr":4,"postgres_db":4,"postgres_password":4,"postgres_us":4,"postgresql":[4,6],"potenti":2,"power":[6,9,10,13,15,16],"practic":10,"prefer":10,"prefix":[0,2,10],"present":7,"prevent":[5,10],"price":[0,9,10],"primari":0,"primary_kei":15,"print":[0,5,10,13,15,16],"privat":10,"proce":16,"process":[0,4,6,7,9,10,13],"process_data":7,"procfil":4,"prod":5,"produc":[0,7],"product":[2,3,5,6,7,9,10,11,15],"profil":10,"programmat":10,"progress":10,"project":[2,3,8],"propag":9,"proper":[7,11,15],"properli":[2,5,9,15],"properti":[0,2,7,9],"prose":2,"protect":[4,11],"proto":4,"protocol":[3,7,9,10,13,16],"prototyp":[2,3,6],"provid":0,"proxi":6,"public":[0,6,10],"public_path":11,"pure":6,"push":[1,4,6,10],"put":[6,10,14,15],"py":[2,3,4,5,7,9,10,14,15],"pydant":[0,2,6,9,14,15],"pyjwt":11,"pypi":2,"pyproject":2,"pytest":[6,8,9],"python":[0,2,3,4,5,6,7,10,14,15,16],"pythonpath":3,"q":[0,7,12],"queri":[2,4,6,7,10,15,16],"query_str":0,"querydict":0,"queue":[6,7],"quick":[0,3,6],"r":[7,9],"race":9,"railwai":[3,4],"rais":[0,2,9,10,11],"raise_server_except":9,"random":[0,5],"rang":[0,7,9,10],"rapidoc":[0,10],"rare":7,"rate":[1,2,4,6,13],"rate_limit":0,"ratelimit":[0,2,6,9,10,13],"rather":9,"raw":[0,3,6,7,10,13,15,16],"re":[0,4,7,9,10,12,13,14,16],"reach":[11,13],"react":[2,10],"reactiv":10,"read":[0,2,3,5,6,10,11,12,14,15],"readabl":10,"readi":[4,5,6,7],"real":[2,5,6,10,11,14,15],"realli":[9,10],"receiv":[0,6,7,9,10,11,13,16],"receive_byt":[10,16],"receive_incom":7,"receive_json":[10,16],"receive_text":[9,10,16],"recommend":10,"reconnect":10,"recv":16,"redirect":[0,2,7,11,12],"redoc":[0,10],"reduc":2,"ref":3,"refactor":[2,9],"refer":[2,6,9],"referr":13,"refresh":15,"refus":10,"regist":[0,9,10,11],"register_blueprint":12,"reject":[1,9,10],"relat":[0,10,15],"releas":8,"reliabl":9,"remain":[0,9,10],"rememb":11,"remov":[10,12,14,16],"renam":9,"render":[0,4,6,10],"render_async":7,"render_templ":12,"replac":[2,7,10,14],"report":[7,9,10],"repres":0,"represent":0,"reproduc":4,"req":[0,2,4,6,7,9,10,11,12,13,14,15,16],"request":[1,2,3,4,6,11,12,13,14,15],"request_id":[0,2,10,13],"request_model":[0,2,9,10,14,15],"requir":[0,2,9,10],"research":6,"resolv":[2,10],"resolve_hello":[0,10],"resourc":[7,10,14],"resp":[0,2,4,6,7,9,10,11,12,13,14,15,16],"respect":3,"respond":[0,2,3,4,5,7,8,9,10,11,12,13,14,15,16],"respons":[2,6,9,10,12,13,14,15,16],"response_model":[0,2,10,14,15],"rest":[2,4,6,7,10],"restrict":[4,10],"result":[0,2,7,10,15],"resum":2,"resume_incomplet":2,"retri":[0,10],"retriev":[0,10,14],"return":[0,2,4,6,7,9,10,11,12,13,14,15],"reusabl":11,"revers":[0,6],"reverse_proxi":4,"rework":2,"rewrit":2,"rewrot":2,"rfc3986":2,"right":[6,7,10,12,13],"roll":15,"room":6,"root":[2,10],"rotat":5,"rout":[1,2,4,6,9,13,14,15,16],"routegroup":0,"router":2,"rst":2,"ruff":[2,8],"rule":5,"run":[0,2,3,6,8,9,10,12,13,16],"run_sync":15,"runner":[2,4],"runtim":3,"runtimeerror":0,"s3":3,"safe":[2,14],"sai":7,"said":4,"same":[3,4,6,7,10,12,13,14,15],"sandbox":6,"save":[7,16],"scalar":15,"scale":6,"schema":[0,2,6,10,11,14,15],"scope":[0,10,13],"scratch":[6,14],"script":16,"search":[0,2,7,10],"second":0,"secret":[4,6,10,11],"secret_kei":[0,3,4,5,10,11],"section":10,"secur":[0,10,13],"securityheadersmiddlewar":13,"see":[0,4,5,7,9,10,13,14,15],"select":[0,2,15],"self":[0,10,11,13],"semant":2,"send":[0,2,6,9,10,11,13,14,16],"send_byt":[10,16],"send_email":0,"send_json":[10,16],"send_text":[9,10,16],"send_with_head":13,"sensit":11,"sent":[0,2,6,7,13],"separ":[7,9,14],"sequenti":2,"serial":[0,2,6,7,10,16],"serializ":7,"serv":[0,2,3,4,5,6,7,9,14,16],"server":[0,1,2,3,4,5,6,9,11,13,14,15],"servererrormiddlewar":13,"servestat":2,"servic":[0,3,4,6,9,10,14],"session":[0,2,5,6,7,9,12,13,15],"session_id":10,"sessionmiddlewar":13,"set":[0,2,3,4,5,6,7,8,9,10,11,15,16],"set_cooki":[0,2,10],"set_text":0,"setattr":15,"setup":[2,5,6,9],"sever":[10,13],"sftp":3,"shape":10,"share":[0,3,7,9,10,15],"shell":5,"short":[0,1,2,10],"shorthand":0,"should":[4,5,14,15],"shouldn":0,"show":[2,10,12,15,16],"shut":[10,15],"shutdown":[0,4,6,9,10],"shutdwown":2,"sibl":6,"side":[7,10,11,16],"sign":[0,5,6,7,10,11,13],"signatur":[7,10,12],"signup":11,"simpl":[3,4,9,10,11,13,14,16],"simplecooki":0,"simpler":[7,10,11,13],"simplest":[5,7,11,13,16],"simpli":11,"simplic":[6,15],"simul":7,"sinc":[7,9],"singl":[0,2,3,6,7,10,12,15],"sit":13,"size":[0,15],"sk":11,"skip":[0,6,10],"slash":7,"sleep":[7,9],"slim":4,"slow":7,"slowlori":4,"slug":7,"small":[4,6,9,10],"smaller":4,"so":[9,10,12,13,14,15],"solv":10,"some":[4,5,10],"some_packag":13,"somemiddlewar":13,"someon":[5,7,10,16],"someth":[6,7,9,10],"sometim":[7,10],"somewher":7,"sourc":[0,5,8,10],"spawn":4,"spec":[7,10],"special":[6,10],"specif":[0,2,5,9,10,13,14],"specifi":3,"sphinx":8,"spin":7,"split":5,"sprawl":6,"sql":15,"sqlalchemi":[2,6,7,14],"sqlite":[5,15],"sse":[0,2,6],"ssl":4,"stabil":2,"stack":13,"stai":[12,15],"standard":[3,4,10,11,14],"starlett":[0,2,6,9,16],"start":[0,3,4,6,10,13,14,15],"startswith":11,"startup":[0,2,6,9,10],"state":[0,2,9,10,11],"statement":6,"static":[0,2,4,6,7,16],"static_app":0,"static_dir":[0,10],"static_rout":[0,2,10],"staticfil":0,"statu":[2,4,6,7,9,10,14],"status_cod":[0,6,7,9,10,11,12,13,14,15],"status_code_saf":0,"stderr":0,"stdlib":2,"still":[10,12],"stop":10,"storag":[3,6],"store":[0,5,10,11,14],"str":[0,7,9,10,11,14,15],"straightforward":10,"stranger":[0,10],"stream":[0,2,6,10,13],"stream_data":0,"stream_fil":[0,2,10],"strict":[10,13],"string":[0,6,7,10,15,16],"strip":[2,10,11],"structur":[1,10],"style":10,"stylesheet":10,"sub":11,"subclass":0,"subcommand":3,"subject":0,"submiss":0,"submit":0,"subrout":[6,9,10,12],"subsequ":[10,11],"subtl":2,"succe":9,"success":[0,7,14],"successfulli":14,"successor":4,"suit":9,"suppli":2,"support":[0,1,2,3,4,6,7,12,15,16],"swagger":[0,6,10,14],"swagger_ui":[0,10],"switch":[2,15,16],"sync":[2,6,7,12],"synchron":[0,12],"syntax":[2,6,7,12],"synthet":9,"system":[3,7,10],"t":[0,4,5,7,9,10,11,12,13,14,15],"tabl":15,"tag":0,"take":[6,7],"tamper":[10,11],"target":2,"task":[0,2,6],"teach":6,"tear":10,"tell":[7,10,14,15],"templat":[0,2,6],"template_str":[0,7],"templates_dir":0,"termin":[3,4],"terms_of_servic":0,"test":[0,2,3,5,6,8,14],"test_500":[2,9],"test_api":9,"test_create_item":9,"test_custom_error":9,"test_echo":16,"test_flask_mount":9,"test_head":9,"test_hello":9,"test_hook":9,"test_json":9,"test_rate_limit":9,"test_upload":9,"test_valid":9,"test_websocket":9,"test_with_lifespan":9,"testclient":[0,2,9,16],"text":[0,2,6,7,9,10,12,16],"textcont":16,"than":[9,10,11,12,13,14],"thei":[0,5,7,9,10,12,13,14,16],"them":[3,4,6,7,9,10,11,12,14,16],"theme":[0,10],"themselv":10,"thi":[0,2,3,4,5,6,7,9,10,11,12,13,14,15,16],"thing":[5,6,7,9,10,13],"think":7,"third":[6,9],"though":4,"thousand":4,"thread":[0,2,6,7,12],"threadpoolexecutor":[0,2],"three":[7,10,16],"through":[0,7,10,13,14,16],"throughput":10,"thu":0,"ti":4,"time":[0,2,6,7,9,10,12,13,14,15,16],"time_start":0,"timedelta":11,"timeout":4,"timingmiddlewar":13,"tip":[2,6],"titl":[0,2,7,10,14,15],"tl":4,"togeth":[4,6,10],"token":[0,6,7,10,16],"token_hex":5,"toml":2,"too":[0,3,4,9,10],"tool":[4,8,13],"toolbelt":2,"toolkit":15,"top":[0,5],"total":10,"tour":[0,6,7],"trace":10,"traceback":[0,2,5,10],"track":15,"tradit":[10,11],"traffic":4,"transact":15,"transform":13,"translat":12,"transport":10,"treat":[0,10],"trick":10,"trigger":9,"true":[0,2,5,7,9,10,11,12,13,15,16],"trust":[2,6,9],"trustedhostmiddlewar":[4,13],"try":[6,7,11,16],"tupl":[0,7,9],"tutori":[2,7,14],"two":[7,9,10,13],"type":[0,2,6,10,12,13,14,16],"typic":[7,10],"typo":[2,10],"ui":[0,2,6,10,14],"unauthor":[0,10,11],"under":[0,7,10,12],"underlin":2,"understand":[6,7],"unexpectedli":16,"unhandl":13,"unicod":0,"union":2,"uniqu":10,"unit":15,"univers":5,"unknown":0,"unless":10,"unlik":10,"unmaintain":2,"unmatch":10,"unpin":2,"unprocess":10,"unrecogn":10,"until":7,"up":[0,2,4,7,8,10],"updat":[2,6,7,10,15,16],"update_book":[14,15],"upgrad":[2,8,10,16],"upload":[0,2,6,7],"url":[0,2,5,6,7,9,10,11,12,13,15],"url_for":[0,2,9],"url_prefix":12,"urllib":2,"us":[0,2,3,4,6,7,10,12,14,16],"usag":[0,2],"user":[0,4,5,7,10,11,12,15],"user_id":[7,10,11,12],"usernam":[10,11],"usual":9,"utcnow":11,"utf":0,"uuid":[0,2,7,10],"uuid4":0,"uv":[3,4,5,6,8,11,15],"uvicorn":[0,2,6,7,13],"uvloop":4,"v":6,"v1":[0,10],"v2":10,"valid":[0,2,6,7,11,13,14,15],"valu":[0,6,7,9,10,11,12,13,14,15,16],"valueerror":[0,9,10,12,14],"var":4,"variabl":[0,4,6,7],"ve":[6,9,12],"venv":8,"verb":10,"veri":[0,7,15],"verifi":[4,9,11],"verify_token":11,"version":[0,2,6,9,10,14],"via":[0,2,4,5,10,12],"view":[0,2,6,7,9,12],"virtual":[3,4],"virtualenv":8,"visit":[10,14],"volum":4,"vue":10,"w":[9,10,16],"wa":[0,2,7,14],"wai":[3,4,6,7,10,11,12,13,15],"wait":[4,12],"walk":[7,10,14],"walkthrough":10,"want":[0,3,4,6,7,9,10,13,14,15,16],"warn":2,"watch":8,"we":[14,15,16],"web":[0,4,6,10,15],"websit":10,"websocket":[0,1,2,4,6,13],"websocket_connect":[9,16],"welcom":[6,7,11],"well":6,"went":6,"werkzeug":[2,9],"what":[0,7,9,10,16],"whatev":7,"when":[0,2,3,4,5,6,7,9,10,12,14,15,16],"where":[0,4,7,10,15,16],"whether":[0,7],"which":[0,2,7,9,10,12,15],"whichev":6,"while":[7,10,12,16],"whitenois":2,"who":[6,7,11],"widget":[9,10],"wildcard":10,"window":2,"wire":7,"with_app":10,"within":[2,10,15],"without":[0,2,4,7,9,10,15],"won":[7,9,10,15],"work":[3,4,5,6,7,10,13,14,15],"workdir":4,"worker":4,"world":[0,3,6,9,10,12],"worri":9,"would":9,"wrap":[0,7,9,10,13],"write":[6,7,10,12],"wrong":10,"ws_auth":16,"wsgi":[0,2,4,6,9,10,12],"www":5,"x":[0,4,6,7,9,10,11,12,13,14],"x00":16,"x01":16,"x02":16,"x89png":7,"xml":0,"xss":10,"yaml":[0,2,6,7,9,10],"year":[14,15],"yield":[0,10,15],"yml":[0,4,10,11],"you":[0,3,4,5,7,9,10,11,12,13,14,15,16],"your":[0,3,4,5,6,7,9,10,11,12,13],"yourself":7,"zero":4},"titles":["API Reference","Backlog","Changelog","Command Line Interface","Deployment","Configuration","Responder","Quick Start","Development Sandbox","Testing","Feature Tour","Authentication","Migrating from Flask","Writing Middleware","Building a REST API","Using SQLAlchemy","WebSocket Tutorial"],"titleterms":{"":14,"0":2,"01":2,"02":2,"03":2,"04":2,"08":2,"09":2,"1":2,"10":2,"11":2,"12":2,"13":2,"15":2,"16":2,"17":2,"18":2,"19":2,"2":2,"20":2,"2018":2,"2019":2,"2026":2,"22":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"In":14,"It":[5,7,14,15],"The":[0,6,12],"ad":[2,13],"after":[9,10],"all":[5,7,14],"allow":5,"api":[0,9,11,12,14],"app":[9,10,11],"asgi":13,"asset":3,"auth":11,"authent":11,"background":[0,7],"backlog":1,"base":10,"bearer":11,"befor":[9,10,16],"big":12,"blueprint":12,"book":14,"build":[3,14],"built":13,"chang":2,"changelog":2,"chat":16,"check":4,"checklist":4,"class":[0,5,10],"client":16,"cloud":4,"code":0,"command":3,"compos":4,"configur":5,"content":10,"convertor":7,"cooki":[9,10],"cor":10,"creat":[7,14],"crud":15,"custom":[3,10,11],"data":16,"databas":15,"debug":5,"defin":[14,15],"delet":14,"deploy":4,"deprec":2,"develop":8,"dict":0,"differ":12,"directli":4,"docker":4,"document":10,"echo":16,"endpoint":[4,15],"env":5,"environ":[3,5],"error":[9,10,11,14],"event":[9,10],"except":11,"featur":10,"file":[3,5,9,10],"filter":10,"fix":2,"fixtur":9,"flask":12,"format":16,"from":[3,12],"frontend":3,"futur":1,"get":[6,9,14],"gradual":12,"graphql":10,"group":[0,10,12],"guid":6,"handl":[9,10,14],"header":9,"health":4,"hello":7,"helper":0,"hook":[9,10,13,16],"host":[5,10],"how":16,"hst":10,"html":16,"id":10,"idea":[1,6],"instal":[6,15],"instanc":3,"interfac":3,"json":[9,12],"kei":[5,11],"launch":3,"lifespan":[9,10,15],"limit":[0,9,10],"line":3,"list":14,"local":4,"memori":14,"messagepack":10,"method":10,"middlewar":13,"migrat":12,"mode":5,"model":[14,15],"modul":3,"mount":[9,10],"name":3,"negoti":10,"next":14,"openapi":10,"oper":8,"order":13,"other":10,"out":14,"paramet":[7,12],"parti":13,"pattern":5,"platform":4,"postgresql":15,"product":4,"project":[6,14],"proxi":4,"public":11,"pure":13,"put":[5,7],"pydant":10,"queri":0,"queue":0,"quick":[7,12],"rate":[0,9,10],"read":7,"refer":[0,12],"remov":2,"render":7,"request":[0,7,9,10,16],"respond":6,"respons":[0,7],"rest":14,"revers":4,"room":16,"rout":[0,7,10,11,12],"run":[4,7,14,15],"sandbox":8,"secret":5,"send":7,"sent":10,"serv":10,"server":[7,10,16],"servic":7,"session":[10,11],"setup":[8,14,15],"shutdown":15,"singl":14,"skip":11,"sqlalchemi":15,"sse":10,"starlett":13,"start":[7,9],"startup":15,"static":10,"statu":0,"storag":14,"support":10,"task":7,"templat":[7,12],"test":[9,16],"third":13,"tip":[9,15],"togeth":[5,7],"token":11,"tour":10,"trust":10,"try":14,"tutori":[6,16],"type":7,"updat":14,"upload":9,"url":3,"us":[5,9,11,13,15],"user":6,"uvicorn":4,"v":13,"v0":2,"v1":2,"v2":2,"v3":2,"valid":[9,10],"variabl":[3,5],"view":10,"web":[7,11],"websocket":[9,10,16],"what":[6,13,14],"when":13,"work":16,"world":7,"write":13,"you":6,"your":[14,15]}}) \ No newline at end of file +Search.setIndex({"alltitles":{"API Key Authentication":[[11,"api-key-authentication"]],"API Reference":[[0,null]],"Added":[[2,"added"],[2,"id2"],[2,"id4"],[2,"id7"],[2,"id11"],[2,"id17"],[2,"id18"],[2,"id21"],[2,"id24"],[2,"id29"],[2,"id36"],[2,"id42"],[2,"id43"],[2,"id44"],[2,"id45"],[2,"id46"],[2,"id49"],[2,"id50"],[2,"id52"],[2,"id55"],[2,"id58"],[2,"id59"],[2,"id60"],[2,"id64"]],"Adding Third-Party Middleware":[[13,"adding-third-party-middleware"]],"After-Request Hooks":[[10,"after-request-hooks"]],"Allowed Hosts":[[5,"allowed-hosts"]],"Authentication":[[11,null]],"Background Queue":[[0,"background-queue"]],"Background Tasks":[[7,"background-tasks"]],"Backlog":[[1,null]],"Bearer Token Authentication":[[11,"bearer-token-authentication"]],"Before-Request Hooks":[[10,"before-request-hooks"]],"Before-Request Hooks for WebSockets":[[16,"before-request-hooks-for-websockets"]],"Blueprints \u2192 Route Groups":[[12,"blueprints-route-groups"]],"Building Frontend Assets":[[3,"building-frontend-assets"]],"Building a REST API":[[14,null]],"Built-in Middleware":[[13,"built-in-middleware"]],"CORS":[[10,"cors"]],"CRUD Endpoints":[[15,"crud-endpoints"]],"Changed":[[2,"changed"],[2,"id1"],[2,"id3"],[2,"id5"],[2,"id8"],[2,"id16"],[2,"id19"],[2,"id22"],[2,"id25"],[2,"id28"],[2,"id33"],[2,"id34"],[2,"id35"],[2,"id37"],[2,"id38"],[2,"id40"],[2,"id41"],[2,"id47"],[2,"id51"],[2,"id56"],[2,"id57"],[2,"id63"]],"Changelog":[[2,null]],"Chat Room":[[16,"chat-room"]],"Choosing an Auth Strategy":[[11,"choosing-an-auth-strategy"]],"Class-Based Views":[[10,"class-based-views"]],"Cloud Platforms":[[4,"cloud-platforms"]],"Code Formatting":[[8,"code-formatting"]],"Command Line Interface":[[3,null]],"Configuration":[[5,null]],"Configuration Class Pattern":[[5,"configuration-class-pattern"]],"Connection Lifecycle":[[16,"connection-lifecycle"]],"Content Negotiation":[[10,"content-negotiation"]],"Cookie-Based Sessions":[[10,"cookie-based-sessions"]],"Cookies":[[10,"cookies"]],"Create a Book":[[14,"create-a-book"]],"Create a Web Service":[[7,"create-a-web-service"]],"Custom Error Handling":[[10,"custom-error-handling"]],"Custom Exception for Auth Errors":[[11,"custom-exception-for-auth-errors"]],"Custom Instance Names":[[3,"custom-instance-names"]],"Data Formats":[[16,"data-formats"]],"Database Setup":[[15,"database-setup"]],"Debug Mode":[[5,"debug-mode"]],"Define Your Models":[[14,"define-your-models"],[15,"define-your-models"]],"Delete a Book":[[14,"delete-a-book"]],"Deployment":[[4,null]],"Deprecated":[[2,"deprecated"]],"Development Sandbox":[[8,null]],"Docker":[[4,"docker"]],"Docker Compose":[[4,"docker-compose"]],"Documentation":[[8,"documentation"]],"Echo Server":[[16,"echo-server"]],"Environment Variables":[[3,"environment-variables"],[5,"environment-variables"]],"Error Handling":[[14,"error-handling"]],"Feature Tour":[[10,null]],"Fixed":[[2,"fixed"],[2,"id6"],[2,"id10"],[2,"id12"],[2,"id13"],[2,"id14"],[2,"id15"],[2,"id20"],[2,"id23"],[2,"id26"],[2,"id27"],[2,"id30"],[2,"id31"],[2,"id32"],[2,"id39"],[2,"id48"],[2,"id53"],[2,"id54"],[2,"id61"],[2,"id62"]],"Future Ideas":[[1,"future-ideas"]],"Get a Single Book":[[14,"get-a-single-book"]],"Getting Started":[[9,"getting-started"]],"Gradual Migration":[[12,"gradual-migration"]],"GraphQL":[[10,"graphql"]],"HSTS":[[10,"hsts"]],"HTML Client":[[16,"html-client"]],"Health Check Endpoint":[[4,"health-check-endpoint"]],"Hello World":[[7,"hello-world"]],"Hooks vs. Middleware":[[13,"hooks-vs-middleware"]],"How WebSockets Work":[[16,"how-websockets-work"]],"In-Memory Storage":[[14,"in-memory-storage"]],"Installation":[[6,"installation"],[15,"installation"]],"JSON APIs":[[12,"json-apis"]],"Launching from a File":[[3,"launching-from-a-file"]],"Launching from a Module":[[3,"launching-from-a-module"]],"Launching from a URL":[[3,"launching-from-a-url"]],"Lifespan Events":[[10,"lifespan-events"]],"Lifespan for Startup and Shutdown":[[15,"lifespan-for-startup-and-shutdown"]],"List All Books":[[14,"list-all-books"]],"MessagePack":[[10,"messagepack"]],"Method Filtering":[[10,"method-filtering"]],"Middleware Order":[[13,"middleware-order"]],"Migrating from Flask":[[12,null]],"Mounting Other Apps":[[10,"mounting-other-apps"]],"OpenAPI Documentation":[[10,"openapi-documentation"]],"Production Checklist":[[4,"production-checklist"]],"Project":[[6,null]],"Project Layout":[[8,"project-layout"]],"Project Setup":[[14,"project-setup"]],"Putting It All Together":[[5,"putting-it-all-together"],[7,"putting-it-all-together"]],"Pydantic Validation":[[10,"pydantic-validation"]],"Query Dict":[[0,"query-dict"]],"Quick Reference":[[12,"quick-reference"]],"Quick Start":[[7,null]],"Rate Limiter":[[0,"rate-limiter"]],"Rate Limiting":[[10,"rate-limiting"]],"Reading Requests":[[7,"reading-requests"]],"Removed":[[2,"removed"],[2,"id9"]],"Rendering Templates":[[7,"rendering-templates"]],"Request":[[0,"request"]],"Request ID":[[10,"request-id"]],"Responder":[[6,null]],"Response":[[0,"response"]],"Reverse Proxy":[[4,"reverse-proxy"]],"Role-Based Access Control":[[11,"role-based-access-control"]],"Route Groups":[[0,"route-groups"],[10,"route-groups"]],"Route Parameters":[[7,"route-parameters"],[12,"route-parameters"]],"Run It":[[14,"run-it"],[15,"run-it"]],"Run the Server":[[7,"run-the-server"]],"Running Locally":[[4,"running-locally"]],"Running Tests":[[8,"running-tests"]],"Secret Key":[[5,"secret-key"]],"Sending Responses":[[7,"sending-responses"]],"Server-Sent Events (SSE)":[[10,"server-sent-events-sse"]],"Serving Files":[[10,"serving-files"]],"Setup":[[8,"setup"]],"Skipping Auth for Public Routes":[[11,"skipping-auth-for-public-routes"]],"Static Files":[[10,"static-files"]],"Status Code Helpers":[[0,"status-code-helpers"]],"Templates":[[12,"templates"]],"Testing":[[9,null]],"Testing Before and After Hooks":[[9,"testing-before-and-after-hooks"]],"Testing Error Handling":[[9,"testing-error-handling"]],"Testing File Uploads":[[9,"testing-file-uploads"]],"Testing Headers and Cookies":[[9,"testing-headers-and-cookies"]],"Testing JSON APIs":[[9,"testing-json-apis"]],"Testing Lifespan Events":[[9,"testing-lifespan-events"]],"Testing Mounted Apps":[[9,"testing-mounted-apps"]],"Testing Rate Limiting":[[9,"testing-rate-limiting"]],"Testing Request Validation":[[9,"testing-request-validation"]],"Testing WebSockets":[[9,"testing-websockets"],[16,"testing-websockets"]],"The API Class":[[0,"the-api-class"]],"The Big Differences":[[12,"the-big-differences"]],"The Idea":[[6,"the-idea"]],"Tips":[[9,"tips"],[15,"tips"]],"Trusted Hosts":[[10,"trusted-hosts"]],"Try It Out":[[14,"try-it-out"]],"Tutorials":[[6,null]],"Type Checking":[[8,"type-checking"]],"Type Convertors":[[7,"type-convertors"]],"Update a Book":[[14,"update-a-book"]],"User Guide":[[6,null]],"Using .env Files":[[5,"using-env-files"]],"Using Fixtures":[[9,"using-fixtures"]],"Using PostgreSQL":[[15,"using-postgresql"]],"Using SQLAlchemy":[[15,null]],"Using Sessions for Web Apps":[[11,"using-sessions-for-web-apps"]],"Using Starlette Middleware":[[13,"using-starlette-middleware"]],"Uvicorn Directly":[[4,"uvicorn-directly"]],"WebSocket Support":[[10,"websocket-support"]],"WebSocket Tutorial":[[16,null]],"What You Get":[[6,"what-you-get"]],"What\u2019s Next":[[14,"what-s-next"]],"When to Use What":[[13,"when-to-use-what"]],"Writing Middleware":[[13,null]],"Writing Pure ASGI Middleware":[[13,"writing-pure-asgi-middleware"]],"v0.0.1 - 2018-10-12":[[2,"v0-0-1-2018-10-12"]],"v0.0.10 - 2018-10-17":[[2,"v0-0-10-2018-10-17"]],"v0.0.2 - 2018-10-13":[[2,"v0-0-2-2018-10-13"]],"v0.0.3 - 2018-10-13":[[2,"v0-0-3-2018-10-13"]],"v0.0.4 - 2018-10-15":[[2,"v0-0-4-2018-10-15"]],"v0.0.5 - 2018-10-15":[[2,"v0-0-5-2018-10-15"]],"v0.0.6 - 2018-10-16":[[2,"v0-0-6-2018-10-16"]],"v0.0.7 - 2018-10-16":[[2,"v0-0-7-2018-10-16"]],"v0.0.8 - 2018-10-17":[[2,"v0-0-8-2018-10-17"]],"v0.0.9 - 2018-10-17":[[2,"v0-0-9-2018-10-17"]],"v0.1.0 - 2018-10-17":[[2,"v0-1-0-2018-10-17"]],"v0.1.1 - 2018-10-17":[[2,"v0-1-1-2018-10-17"]],"v0.1.2 - 2018-10-18":[[2,"v0-1-2-2018-10-18"]],"v0.1.3 - 2018-10-18":[[2,"v0-1-3-2018-10-18"]],"v0.1.4 - 2018-10-19":[[2,"v0-1-4-2018-10-19"]],"v0.1.5 - 2018-10-20":[[2,"v0-1-5-2018-10-20"]],"v0.1.6 - 2018-10-20":[[2,"v0-1-6-2018-10-20"]],"v0.2.0 - 2018-10-22":[[2,"v0-2-0-2018-10-22"]],"v0.2.1 - 2018-10-23":[[2,"v0-2-1-2018-10-23"]],"v0.2.2 - 2018-10-23":[[2,"v0-2-2-2018-10-23"]],"v0.2.3 - 2018-10-24":[[2,"v0-2-3-2018-10-24"]],"v0.3.0 - 2018-10-24":[[2,"v0-3-0-2018-10-24"]],"v0.3.1 - 2018-10-24":[[2,"v0-3-1-2018-10-24"]],"v0.3.2 - 2018-10-25":[[2,"v0-3-2-2018-10-25"]],"v0.3.3 - 2018-10-25":[[2,"v0-3-3-2018-10-25"]],"v1.0.0 - 2018-10-26":[[2,"v1-0-0-2018-10-26"]],"v1.0.1 - 2018-10-26":[[2,"v1-0-1-2018-10-26"]],"v1.0.2 - 2018-10-27":[[2,"v1-0-2-2018-10-27"]],"v1.0.3 - 2018-10-27":[[2,"v1-0-3-2018-10-27"]],"v1.0.4 - 2018-10-27":[[2,"v1-0-4-2018-10-27"]],"v1.0.5- 2018-10-27":[[2,"v1-0-5-2018-10-27"]],"v1.1.0 - 2018-10-27":[[2,"v1-1-0-2018-10-27"]],"v1.1.1 - 2018-10-29":[[2,"v1-1-1-2018-10-29"]],"v1.1.2 - 2018-11-11":[[2,"v1-1-2-2018-11-11"]],"v1.1.3 - 2019-01-12":[[2,"v1-1-3-2019-01-12"]],"v1.2.0 - 2018-12-29":[[2,"v1-2-0-2018-12-29"]],"v1.3.0 - 2019-02-22":[[2,"v1-3-0-2019-02-22"]],"v1.3.1 - 2019-04-28":[[2,"v1-3-1-2019-04-28"]],"v1.3.2 - 2019-08-15":[[2,"v1-3-2-2019-08-15"]],"v2.0.0 - 2019-09-19":[[2,"v2-0-0-2019-09-19"]],"v2.0.1 - 2019-09-20":[[2,"v2-0-1-2019-09-20"]],"v2.0.2 - 2019-09-20":[[2,"v2-0-2-2019-09-20"]],"v2.0.3 - 2019-09-20":[[2,"v2-0-3-2019-09-20"]],"v2.0.4 - 2019-11-19":[[2,"v2-0-4-2019-11-19"]],"v2.0.5 - 2019-12-15":[[2,"v2-0-5-2019-12-15"]],"v3.0.0 - 2026-03-22":[[2,"v3-0-0-2026-03-22"]],"v3.2.0 - 2026-03-22":[[2,"v3-2-0-2026-03-22"]],"v3.3.0 - 2026-03-22":[[2,"v3-3-0-2026-03-22"]],"v3.4.0 - 2026-03-22":[[2,"v3-4-0-2026-03-22"]],"v3.5.0 - 2026-03-24":[[2,"v3-5-0-2026-03-24"]]},"docnames":["api","backlog","changes","cli","deployment","guide-config","index","quickstart","sandbox","testing","tour","tutorial-auth","tutorial-flask","tutorial-middleware","tutorial-rest","tutorial-sqlalchemy","tutorial-websockets"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1},"filenames":["api.rst","backlog.md","changes.md","cli.rst","deployment.rst","guide-config.rst","index.rst","quickstart.rst","sandbox.md","testing.rst","tour.rst","tutorial-auth.rst","tutorial-flask.rst","tutorial-middleware.rst","tutorial-rest.rst","tutorial-sqlalchemy.rst","tutorial-websockets.rst"],"indexentries":{"accepts() (responder.request method)":[[0,"responder.Request.accepts",false]],"add_event_handler() (responder.api method)":[[0,"responder.API.add_event_handler",false]],"add_middleware() (responder.api method)":[[0,"responder.API.add_middleware",false]],"add_route() (responder.api method)":[[0,"responder.API.add_route",false]],"after_request() (responder.api method)":[[0,"responder.API.after_request",false]],"api (class in responder)":[[0,"responder.API",false]],"apparent_encoding (responder.request property)":[[0,"responder.Request.apparent_encoding",false]],"backgroundqueue (class in responder.background)":[[0,"responder.background.BackgroundQueue",false]],"before_request() (responder.api method)":[[0,"responder.API.before_request",false]],"check() (responder.ext.ratelimit.ratelimiter method)":[[0,"responder.ext.ratelimit.RateLimiter.check",false]],"client (responder.request property)":[[0,"responder.Request.client",false]],"content (responder.request property)":[[0,"responder.Request.content",false]],"cookies (responder.request property)":[[0,"responder.Request.cookies",false]],"encoding (responder.request property)":[[0,"responder.Request.encoding",false]],"exception_handler() (responder.api method)":[[0,"responder.API.exception_handler",false]],"file() (responder.response method)":[[0,"responder.Response.file",false]],"full_url (responder.request property)":[[0,"responder.Request.full_url",false]],"get() (responder.models.querydict method)":[[0,"responder.models.QueryDict.get",false]],"get_list() (responder.models.querydict method)":[[0,"responder.models.QueryDict.get_list",false]],"graphql() (responder.api method)":[[0,"responder.API.graphql",false]],"group() (responder.api method)":[[0,"responder.API.group",false]],"headers (responder.request property)":[[0,"responder.Request.headers",false]],"install() (responder.ext.ratelimit.ratelimiter method)":[[0,"responder.ext.ratelimit.RateLimiter.install",false]],"is_100() (in module responder.status_codes)":[[0,"responder.status_codes.is_100",false]],"is_200() (in module responder.status_codes)":[[0,"responder.status_codes.is_200",false]],"is_300() (in module responder.status_codes)":[[0,"responder.status_codes.is_300",false]],"is_400() (in module responder.status_codes)":[[0,"responder.status_codes.is_400",false]],"is_500() (in module responder.status_codes)":[[0,"responder.status_codes.is_500",false]],"is_json (responder.request property)":[[0,"responder.Request.is_json",false]],"is_secure (responder.request property)":[[0,"responder.Request.is_secure",false]],"items() (responder.models.querydict method)":[[0,"responder.models.QueryDict.items",false]],"items_list() (responder.models.querydict method)":[[0,"responder.models.QueryDict.items_list",false]],"media() (responder.request method)":[[0,"responder.Request.media",false]],"method (responder.request property)":[[0,"responder.Request.method",false]],"mimetype (responder.request property)":[[0,"responder.Request.mimetype",false]],"module":[[0,"module-responder",false]],"mount() (responder.api method)":[[0,"responder.API.mount",false]],"ok (responder.response property)":[[0,"responder.Response.ok",false]],"on_event() (responder.api method)":[[0,"responder.API.on_event",false]],"params (responder.request property)":[[0,"responder.Request.params",false]],"path_matches_route() (responder.api method)":[[0,"responder.API.path_matches_route",false]],"path_params (responder.request property)":[[0,"responder.Request.path_params",false]],"querydict (class in responder.models)":[[0,"responder.models.QueryDict",false]],"ratelimiter (class in responder.ext.ratelimit)":[[0,"responder.ext.ratelimit.RateLimiter",false]],"redirect() (responder.api method)":[[0,"responder.API.redirect",false]],"redirect() (responder.response method)":[[0,"responder.Response.redirect",false]],"request (class in responder)":[[0,"responder.Request",false]],"requests (responder.api property)":[[0,"responder.API.requests",false]],"responder":[[0,"module-responder",false]],"response (class in responder)":[[0,"responder.Response",false]],"route() (responder.api method)":[[0,"responder.API.route",false]],"routegroup (class in responder.api)":[[0,"responder.api.RouteGroup",false]],"run() (responder.api method)":[[0,"responder.API.run",false]],"run() (responder.background.backgroundqueue method)":[[0,"responder.background.BackgroundQueue.run",false]],"schema() (responder.api method)":[[0,"responder.API.schema",false]],"serve() (responder.api method)":[[0,"responder.API.serve",false]],"session (responder.request property)":[[0,"responder.Request.session",false]],"session() (responder.api method)":[[0,"responder.API.session",false]],"set_cookie() (responder.response method)":[[0,"responder.Response.set_cookie",false]],"sse() (responder.response method)":[[0,"responder.Response.sse",false]],"state (responder.request property)":[[0,"responder.Request.state",false]],"static_app (responder.api property)":[[0,"responder.API.static_app",false]],"status_code_safe (responder.response property)":[[0,"responder.Response.status_code_safe",false]],"stream() (responder.response method)":[[0,"responder.Response.stream",false]],"stream_file() (responder.response method)":[[0,"responder.Response.stream_file",false]],"task() (responder.background.backgroundqueue method)":[[0,"responder.background.BackgroundQueue.task",false]],"template() (responder.api method)":[[0,"responder.API.template",false]],"template_string() (responder.api method)":[[0,"responder.API.template_string",false]],"text (responder.request property)":[[0,"responder.Request.text",false]],"url (responder.request property)":[[0,"responder.Request.url",false]],"url_for() (responder.api method)":[[0,"responder.API.url_for",false]]},"objects":{"":[[0,0,0,"-","responder"]],"responder":[[0,1,1,"","API"],[0,1,1,"","Request"],[0,1,1,"","Response"]],"responder.API":[[0,2,1,"","add_event_handler"],[0,2,1,"","add_middleware"],[0,2,1,"","add_route"],[0,2,1,"","after_request"],[0,2,1,"","before_request"],[0,2,1,"","exception_handler"],[0,2,1,"","graphql"],[0,2,1,"","group"],[0,2,1,"","mount"],[0,2,1,"","on_event"],[0,2,1,"","path_matches_route"],[0,2,1,"","redirect"],[0,3,1,"","requests"],[0,2,1,"","route"],[0,2,1,"","run"],[0,2,1,"","schema"],[0,2,1,"","serve"],[0,2,1,"","session"],[0,3,1,"","static_app"],[0,2,1,"","template"],[0,2,1,"","template_string"],[0,2,1,"","url_for"]],"responder.Request":[[0,2,1,"","accepts"],[0,3,1,"","apparent_encoding"],[0,3,1,"","client"],[0,3,1,"","content"],[0,3,1,"","cookies"],[0,3,1,"","encoding"],[0,3,1,"","full_url"],[0,3,1,"","headers"],[0,3,1,"","is_json"],[0,3,1,"","is_secure"],[0,2,1,"","media"],[0,3,1,"","method"],[0,3,1,"","mimetype"],[0,3,1,"","params"],[0,3,1,"","path_params"],[0,3,1,"","session"],[0,3,1,"","state"],[0,3,1,"","text"],[0,3,1,"","url"]],"responder.Response":[[0,2,1,"","file"],[0,3,1,"","ok"],[0,2,1,"","redirect"],[0,2,1,"","set_cookie"],[0,2,1,"","sse"],[0,3,1,"","status_code_safe"],[0,2,1,"","stream"],[0,2,1,"","stream_file"]],"responder.api":[[0,1,1,"","RouteGroup"]],"responder.background":[[0,1,1,"","BackgroundQueue"]],"responder.background.BackgroundQueue":[[0,2,1,"","run"],[0,2,1,"","task"]],"responder.ext.ratelimit":[[0,1,1,"","RateLimiter"]],"responder.ext.ratelimit.RateLimiter":[[0,2,1,"","check"],[0,2,1,"","install"]],"responder.models":[[0,1,1,"","QueryDict"]],"responder.models.QueryDict":[[0,2,1,"","get"],[0,2,1,"","get_list"],[0,2,1,"","items"],[0,2,1,"","items_list"]],"responder.status_codes":[[0,4,1,"","is_100"],[0,4,1,"","is_200"],[0,4,1,"","is_300"],[0,4,1,"","is_400"],[0,4,1,"","is_500"]]},"objnames":{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","property","Python property"],"4":["py","function","Python function"]},"objtypes":{"0":"py:module","1":"py:class","2":"py:method","3":"py:property","4":"py:function"},"terms":{"":[0,2,3,4,5,6,7,9,10,11,12,13,15,16],"0":[0,3,4,5,7,10,14,15],"00":0,"01":0,"0441172719":14,"1":[0,1,3,4,5,7,9,10,11,12,14,16],"10":[0,6,7,10],"100":[0,2,10],"1000":16,"1001":16,"1008":16,"1011":16,"127":[3,4,5],"13":4,"14":2,"150mb":4,"16":4,"1965":14,"2":[0,1,4,7,9,10,14,15,16],"200":[0,4,7,9,10,14],"201":[0,7,9,12,14,15],"2026":0,"204":[14,15],"24":11,"2xx":0,"3":[0,1,4,6,7,9,10,14,16],"30":4,"3000":5,"301":[0,7],"308":2,"32":5,"3600":[0,10],"3f":13,"4":[4,7],"40":2,"400":[0,2,9,10,14],"401":[0,10,11],"403":11,"404":[0,7,12,14,15],"41d4":7,"422":[2,9,10,14],"429":[0,9,10],"446655440000":7,"500":[2,7,9,10,13,14],"5000":10,"5042":[3,4,7,10,11,14,16],"550e8400":7,"561":2,"60":[0,2,9,10],"600":[0,10],"7":[9,11],"8":0,"80":4,"8000":[4,7],"8192":0,"9":9,"978":14,"99":9,"A":[0,4,5,6,7,10,13,16],"And":[5,6,7,11],"As":[0,10],"But":[7,9,10],"By":[3,7,9,10,13,14],"For":[0,3,4,5,7,9,10,11,13,14,15],"If":[0,3,5,6,7,9,10,12,15],"In":[0,5,6,7,10,11,12,15,16],"It":[0,3,6,9,10,13],"No":[6,9,10,11,12,14],"Not":7,"On":[5,10],"One":[6,7,9],"Or":[0,5,8],"That":[4,6,7,9],"The":[2,3,4,5,7,9,10,11,13,14,15,16],"There":[9,10],"These":7,"To":[14,15],"Will":0,"With":[0,5],"_":9,"__call__":13,"__init__":[11,13],"__main__":[4,6,7,9,14,15],"__name__":[4,6,7,9,10,12,14,15],"__tablename__":15,"_route_for":2,"a2wsgi":2,"a716":7,"abc":14,"abc123":[0,9,10,11],"abil":2,"abl":0,"abort":12,"about":[4,7,9,12],"abov":[6,11],"abstract":[13,15],"accept":[0,1,2,7,9,10,16],"access":[0,2,4,6,10,13,15],"accumul":16,"acm":3,"across":[2,4,10,15],"activ":[8,16],"actual":[0,4,7,10],"ad":[0,6,10],"adapt":10,"add":[0,2,4,5,7,11,13,14,15,16],"add_event_handl":0,"add_head":[10,13],"add_middlewar":[0,13],"add_request_id":0,"add_rout":[0,10],"add_tim":[9,10],"add_vers":9,"addeventlisten":16,"addit":[0,13],"address":[0,5,7,10],"adher":2,"admin":11,"affect":10,"after":[0,6,7,11,15,16],"after_request":[0,2,9,10,13],"ag":[0,10],"again":11,"against":[0,4,10,11],"aggreg":4,"agre":7,"ahead":2,"ai":10,"aiosqlit":15,"alemb":15,"algorithm":11,"alias":2,"alic":10,"aliv":4,"all":[0,2,3,4,6,8,9,10,12,13,15,16],"alloc":9,"allow":[4,6,10],"allow_credenti":[0,10],"allow_head":[0,10],"allow_method":[0,5,10],"allow_origin":[0,5,10],"allow_origin_regex":0,"allowed_host":[0,5,9,10],"alongsid":10,"alpin":4,"alreadi":[0,9,10],"also":[0,2,3,7,9,10,16],"altern":[0,10],"alwai":[4,5,6,7,10,16],"an":[0,3,4,5,6,7,10,12,13,14,15,16],"analysi":10,"angle_bracket":12,"angular":10,"ani":[0,3,4,5,6,7,9,10,11,13,14,15,16],"annot":[2,6,7,10,15],"annual":[7,10],"answer":[10,16],"anyon":6,"anyth":7,"anywher":[4,10],"api":[2,3,4,5,6,7,8,10,13,15,16],"api_kei":11,"api_v1":12,"apispec":2,"app":[0,2,3,4,5,6,7,8,12,13,14,15,16],"appar":0,"apparent_encod":0,"appear":[0,10],"appendchild":16,"appli":[0,13],"applic":[0,2,3,4,5,7,9,10,11,13,14,15],"approach":[5,10,11,12,13],"appropri":[10,15],"ar":[0,2,3,4,6,7,9,10,11,12,13,15,16],"architectur":10,"aren":[7,13],"arg":[0,12],"argument":[0,2,7,12,13],"around":[0,6],"arriv":[7,12],"asgi":[0,2,4,6,7,10,12],"ask":[6,10,16],"assert":[9,16],"asset":[0,4,6,10],"assign":14,"associ":0,"astral":4,"async":[0,2,4,6,7,9,10,11,12,13,14,15,16],"async_sess":15,"async_sessionmak":15,"asynccontextmanag":[10,15],"asynchron":[2,4],"asyncio":[2,15],"asyncpg":[4,15],"attach":10,"attack":[4,5,10],"attribut":[0,3,15],"audio":16,"auth":[2,6,10,13],"auth_check":10,"auth_guard":11,"authent":[6,7,10,13,16],"autherror":11,"author":[0,7,10,11,13,14,15],"auto":[0,2,8,10,16],"auto_escap":0,"autobuild":8,"autoincr":15,"automat":[0,2,3,4,5,6,7,9,10,11,12,13,14,15],"avail":[0,7,10],"avoid":[9,10,13,16],"aw":4,"awai":16,"await":[0,2,7,9,10,11,12,13,14,15,16],"azur":[3,4],"b":[0,7,9,13,15,16],"back":[0,7,10,15,16],"background":[2,6,8],"backgroundqueu":0,"backlog":6,"bad":[9,10,14],"balanc":4,"bandwidth":10,"bar":10,"bare":[2,16],"base":[0,2,6,13,15],"base_url":0,"basehttpmiddlewar":13,"basemodel":[0,9,10,14,15],"basic":7,"batteri":6,"battl":6,"bearer":6,"becaus":[0,6,7,11,12,14],"becom":[0,15],"been":0,"befor":[0,1,2,4,6,7,11,13,15],"before_request":[0,1,2,9,10,11,12,13,16],"begin":15,"behav":0,"behavior":[5,13],"behind":[4,10],"being":[0,10],"best":[6,11],"better":6,"between":13,"bidirect":[10,16],"big":6,"biggest":12,"bin":[4,8],"binari":[7,10,16],"bind":[0,3,4,5,7],"blob":3,"block":[0,7,9,10,12,16],"blocklist":11,"blueprint":6,"bodi":[0,2,7,9,10,12,14,16],"boilerpl":6,"book":[6,15],"book_id":[14,15],"bookin":[14,15],"bookout":15,"books_db":14,"bool":5,"born":6,"both":[6,7,10,12,16],"bottom":14,"boundari":10,"box":13,"bp":12,"break":[2,9],"bring":6,"broad":2,"broadcast":16,"broke":[7,9],"broker":7,"browser":[7,8,10,11,14,16],"bucket":[0,10],"buffer":[0,7],"bufix":2,"bug":[2,9,16],"bugfix":2,"build":[2,4,6,7,8,10,11,15,16],"builder":15,"built":[1,2,4,6,7,9,10,16],"bump":2,"bypass":[4,13],"byte":[0,2,6,7,13,16],"c":[5,16],"cach":[7,9,10],"caddi":4,"caddyfil":4,"call":[2,3,7,9,10,13,14,16],"call_next":13,"callabl":[0,13],"came":7,"can":[0,2,3,4,5,7,9,10,11,12,13,14,15,16],"carri":7,"case":[0,6,7,13],"cat":10,"catalog":14,"catch":[10,11,13,16],"categori":0,"cd":8,"ceas":2,"celeri":7,"cell":10,"central":[0,7],"certain":0,"certif":4,"chang":[0,15],"changelog":6,"channel":[10,16],"chardet":0,"chat":[2,6,10],"check":[0,6,9,10,11,13,16],"check_api_kei":11,"check_auth":0,"check_exist":[0,10,14,15],"checker":15,"checklist":6,"choic":[7,10],"choos":[6,10],"chunk":[0,10],"chunk_siz":0,"ci":2,"circuit":[0,1,2,10],"class":[2,6,7,8,9,11,13,14,15],"clean":[6,10,14],"cleaner":[10,11,15],"cleanli":5,"cleanup":[2,10],"clear":[11,16],"cli":[2,8,11],"click":6,"client":[0,2,6,7,9,10,11,14],"clone":8,"close":[9,10,15,16],"close_database_connection_pool":0,"closur":16,"cloud":[3,5,6,7],"cmd":4,"code":[2,3,4,5,6,7,9,10,11,14,15,16],"codebas":2,"coercion":10,"collabor":[10,16],"colon":3,"column":15,"com":[0,3,4,5,7,8,10],"combin":7,"come":[7,10,12],"command":[4,6],"commit":[5,15],"common":[0,3,4,5,7,10,11,12,13,14,16],"commonli":7,"commun":[7,10,11],"compact":10,"compat":[0,2],"complement":10,"complet":[7,10,14,16],"complex":[13,15],"compon":13,"compos":[6,15],"comprehens":2,"compress":[6,7,13],"compromis":5,"comput":7,"concept":[2,10,12],"concern":[7,13],"concurr":[0,4],"condit":[9,10],"config":[4,5,8,15],"configur":[0,2,4,6,7,9,10,13],"confirm":4,"conflict":2,"confus":9,"conn":15,"connect":[0,4,6,7,9,10,13,15],"consid":[7,15],"consist":[7,10],"consol":[10,15],"const":[10,16],"constructor":[0,13],"consum":10,"contact":0,"contain":[0,4,7],"container":4,"content":[0,2,6,7,8,9,13,14],"content_typ":[0,9,10],"context":[1,2,6,9,10,15,16],"contextlib":[10,15],"continu":7,"contract":9,"control":[0,4,5,6,7,10,13,15],"conveni":[0,5,15],"convent":[3,4,14],"convert":[2,7],"convertor":[2,6,12],"cooki":[0,2,5,6,7,11,12,13],"copi":4,"cor":[0,2,5,6,9,13],"core":[2,4],"coroutin":0,"correctli":4,"correspond":15,"cors_en":5,"cors_origin":5,"cors_param":[0,5,10],"corsmiddlewar":13,"count":2,"cover":[5,11,13],"coverag":[2,8],"cpu":[0,4,7],"crash":2,"creat":[0,6,9,10,11,12,15],"create_al":15,"create_asgi_app":10,"create_async_engin":15,"create_book":[14,15],"create_connect":16,"create_item":[0,10,12],"create_pet":10,"create_token":11,"createel":16,"creation":[13,15],"credenti":11,"cross":[10,13],"crud":[6,7,14],"css":10,"csv":[0,10],"curl":[3,4,7,10,11,14],"curly_brac":12,"custom":[0,2,6,7,9,14,16],"cut":13,"cycl":7,"d":[7,9,14],"dashboard":[5,10,11,16],"data":[0,2,4,5,6,7,9,10,11,12,14,15],"databas":[4,5,6,7,9,10,11,14],"database_url":[4,5,15],"date":0,"datetim":11,"db":[4,5,15],"dead":16,"debug":[0,2,4,6,10,12],"decim":7,"declar":[2,7],"declarativebas":15,"decod":[2,10,11],"decor":[0,2,7,10],"deep":6,"def":[0,4,6,7,9,10,11,12,13,14,15,16],"def456":11,"default":[0,2,3,4,5,7,9,10,15],"default_valu":[0,10],"defend":10,"defin":[0,6,7,10,11],"definit":0,"del":14,"delet":[5,6,7,10,15],"delete_book":[14,15],"deliber":7,"demo":3,"deni":13,"denpend":2,"dep":2,"depend":[2,4,8,9,13],"depends_on":4,"deploi":[4,6],"deploy":[2,6,7],"depth":10,"describ":10,"descript":[0,10],"design":[7,10,14],"detail":[4,5,10,14],"detect":[0,6,10],"dev":[2,4,5],"develop":[3,4,5,10,15],"devic":10,"dict":[6,7,10,11,14,15],"dictionari":0,"differ":[0,1,3,5,6,9,10,11,15],"digit":7,"direct":[0,2,10,13],"directli":[3,6,7,9,10,14,15],"directori":[0,7,10],"disabl":[4,9,15],"discard":16,"disconnect":16,"disk":[0,7,10],"dispatch":[2,10,13],"dispos":15,"distribut":[4,10],"div":16,"django":[6,10],"do":[4,5,7,10],"doc":[0,2,8,9,10,11,14],"docker":[5,6,7],"dockerfil":4,"docs_rout":[0,10,14],"docstr":[2,10],"doctyp":16,"document":[0,2,4,6,14,16],"doe":15,"doesn":[0,10,14,15],"domain":[0,4,5,10],"don":[4,5,7,9,10,11,12,15],"done":4,"dot":3,"dotenv":5,"doubl":14,"down":[10,15],"download":10,"downsid":11,"dramat":2,"driver":15,"drop":[2,16],"dump":2,"dune":14,"duplex":10,"duplic":10,"durat":13,"dure":[3,4,9,11,15],"duti":14,"dynam":7,"e":[0,16],"e29b":7,"each":[0,4,9,10,15],"easi":[3,5,7],"echo":[6,7,15],"ecosystem":[6,7],"edit":8,"editor":[10,16],"effect":[9,14],"effici":4,"either":[0,16],"element":[0,10],"els":[7,10,11,12,15],"email":7,"emb":[10,11],"empti":[0,14],"enabl":[0,2,4,10,13,14],"enable_async":7,"enable_hst":[0,10,13],"encod":[0,2,11],"encrypt":11,"end":[7,14],"endpoint":[0,1,2,6,9,10,11,12,14],"enforc":10,"engin":[7,15],"enough":[4,13],"ensur":[10,14,15,16],"enter":[9,16],"entir":[0,4,10,11,13,14],"entiti":10,"entri":[8,14],"env":[4,6],"environ":[0,4,6,7],"eol":2,"equival":12,"error":[0,2,5,6,15,16],"errorhandl":12,"escap":0,"essenti":10,"establish":16,"etc":[7,9,10],"even":[3,4,10,16],"event":[0,2,6,7,12,16],"event_typ":0,"eventsourc":10,"ever":[5,6],"everi":[0,4,5,6,7,9,10,11,13,14,15],"everyth":[0,2,4,7,10,12,14,15,16],"everywher":[3,5],"evolv":15,"exact":2,"exactli":[9,10],"exampl":[0,2,3,4,5,7,8,10,11],"exc":[0,9,10,11,14],"exceed":[0,10],"except":[0,2,6,9,10,13,16],"exception_cl":0,"exception_handl":[0,2,9,10,11,12,14],"exceptionmiddlewar":13,"execut":15,"exist":[0,2,6,12,13],"exit":[4,9,10,16],"exp":11,"expand":2,"expect":7,"expens":4,"expir":[0,10,11],"expire_on_commit":15,"explain":10,"explan":0,"explicit":[7,10,12],"explicitli":[10,12],"explor":[7,10],"export":[0,5,10],"expos":[4,5],"expose_head":0,"express":[6,7],"ext":[0,2,8,9,10,15],"extens":[2,7,8],"extern":7,"extra":[2,4,10,13],"extract":0,"extrem":7,"f":[0,4,6,7,9,10,11,13,14,16],"factori":[11,15],"fail":[9,10,15],"failur":[2,8,9],"falcon":[6,10],"fall":0,"fals":[0,4,5,9,10,14,15],"familiar":[6,12],"fast":[4,6,7,9],"fastapi":6,"faster":[4,10,13],"featur":[0,6,7],"feed":10,"feel":6,"fetch":3,"few":12,"fido":10,"field":[0,2,9,10,14],"figur":7,"file":[0,2,4,6,7,8,14,15,16],"filenam":[0,9],"filepath":7,"filesystem":[2,3],"fill":7,"filter":[6,7],"final":16,"find":[3,10,12],"fine":[4,10,13,15],"fire":[0,9],"first":[0,8,9,10,11,13,14,15],"fit":6,"fix":8,"fixtur":6,"flag":[4,10,15],"flask":[2,6,7,9,10],"flask_app":[9,10,12],"flatten":2,"float":[0,7,9,10],"flow":[11,13],"fly":[3,4],"fmt":2,"follow":7,"font":10,"forg":[5,10],"forget":0,"form":[0,7,11,12],"format":[0,2,6,7,10,11],"formerli":10,"forward":[4,10],"found":[2,7,14,15],"foundat":10,"fragment":3,"frame":13,"framework":[6,10],"franca":7,"frank":14,"free":2,"freeli":16,"fresh":9,"from":[0,2,4,5,6,7,9,10,11,13,14,15,16],"from_attribut":15,"front":4,"frontend":[6,10],"fsspec":3,"full":[0,2,3,7,8,10],"full_url":[0,7,10],"fulli":[7,16],"fun":6,"func":0,"function":[0,7,10,12,13],"futur":[0,2,6],"g":0,"game":[10,16],"gatewai":4,"gener":[0,2,5,6,9,10,13,14],"get":[0,2,5,7,10,11,15],"get_book":[14,15],"get_list":0,"get_m":11,"get_us":[0,10,12],"getattr":11,"getelementbyid":16,"getenv":5,"getlist":0,"ghcr":4,"git":[5,8],"github":[2,3,8],"gitignor":5,"give":[0,9,10,13,15],"given":[0,9],"global":[12,14],"gmt":0,"go":[4,7,12,16],"goe":[10,12],"good":[4,6,10,11],"googl":[3,4],"got":16,"grace":4,"grade":7,"gradual":[6,10],"graduat":13,"grain":15,"graphen":[0,2,6,10],"graphiql":[2,6,10],"graphql":[0,2,6,8],"great":[3,6,10],"greet":[6,7,10],"greet_world":6,"greetingresourc":10,"group":[2,6],"grow":10,"guard":11,"guid":[2,5,7,11,12,15],"guido":7,"gzip":[6,7],"gzipmiddlewar":13,"h":[7,10,11,14],"h1":[0,7,11],"ha":[7,9,12,14,16],"half":7,"halv":10,"hand":0,"handl":[0,2,4,5,6,7,11,13,16],"handle_auth_error":11,"handle_value_error":[0,10,14],"handler":[0,6,9,10,11,13,14,16],"handshak":16,"happen":[6,7,10],"hard":9,"hasn":0,"have":[0,2,3,7,9,11,12,13,14],"hdf":3,"head":3,"header":[0,2,4,5,6,7,10,11,12,13,16],"health":[6,11],"healthcheck":4,"healthi":4,"heavi":7,"hello":[0,3,6,9,10,12,16],"hello_html":7,"hello_json":7,"hello_to":7,"hello_world":7,"helloworld":3,"help":[0,15],"helper":[6,11],"herbert":14,"here":[4,5,7,10,12,16],"heroku":[3,4],"high":[4,10],"hold":[0,6,7],"home":6,"homepag":2,"honor":[4,7],"hood":10,"hook":[0,2,6,7,11],"host":[0,2,4,6,7,9,13],"hostnam":10,"hour":[10,11],"how":[3,5,6,7,10,11,12,14,15],"hs256":11,"hst":6,"html":[0,2,6,7,8,10,11,12],"http":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16],"httponli":[0,10],"httpsredirect":0,"httpsredirectmiddlewar":[0,4,13],"httpx":[2,9],"i":[0,2,3,4,5,6,7,9,10,11,12,13,14,15,16],"id":[0,2,6,7,12,13,14,15,16],"idea":12,"idempot":14,"ident":12,"identifi":10,"imag":[4,7,10,16],"immedi":[0,6,7,10],"immut":2,"imperson":5,"implement":9,"import":[0,2,3,5,6,7,9,10,11,12,13,14,15,16],"improv":2,"inaccess":0,"includ":[3,4,6,7,9,10,11,14],"incom":[0,7,10,14],"incredibli":10,"independ":4,"index":[0,7,8,10,16],"individu":10,"industri":10,"info":[0,2,10],"inform":[0,14],"infrastructur":[4,6],"inherit":[0,10],"initi":[0,9,16],"inject":[3,10,13],"innermost":13,"input":[2,9,10,14,16],"insensit":[0,6,7],"insid":13,"inspect":[0,2],"instal":[0,2,3,4,5,8,9,10,11,16],"instanc":[0,4,6,7,9],"instant":7,"instantli":4,"instead":[0,7,9,10,13,14,15,16],"instruct":4,"insuffici":11,"int":[0,2,7,10,11,12,14,15],"integ":[0,7,14],"integr":[10,13,14,15],"intens":7,"intent":[6,16],"intention":10,"interact":[2,10,14],"interfac":[2,4,6,7,12],"intern":[9,10,11,13],"interv":4,"invalid":[5,9,10,11],"invalidtokenerror":11,"involv":0,"io":[3,4],"iot":10,"ip":[0,7,10],"is_100":0,"is_200":0,"is_300":0,"is_400":0,"is_500":0,"is_class_bas":2,"is_http":0,"is_json":[0,2,7],"is_secur":[0,7],"isbn":[14,15],"iscoroutinefunct":2,"isn":[7,10,12],"issu":[2,11],"item":[0,9,10,12,15],"itemin":[0,10],"itemout":[0,10],"items_list":0,"iter":16,"its":[0,2,4,14,15],"itself":11,"j":10,"jan":0,"javascript":[0,3,10],"jinja2":[0,7,12],"jpeg":10,"jpg":10,"json":[0,3,6,7,8,10,11,14,16],"jsonifi":12,"jump":7,"just":[4,9,10,13,15,16],"jwt":11,"k":8,"keep":[2,4,5,7,9,10,13,15,16],"kei":[0,4,6,7,9,10,12,15,16],"kennethreitz":[3,8],"keypress":16,"keyword":[0,7,12,13],"know":[5,7],"known":[0,11],"kubernet":4,"kwarg":0,"languag":10,"larg":[0,2,10],"larger":[5,9,13],"last":[0,13],"later":[7,9],"latest":4,"launch":[4,6],"layer":13,"lazi":2,"lazili":0,"lead":9,"learn":10,"legaci":12,"less":10,"let":[3,4,7,10,14,15],"level":[4,13],"lib":4,"librari":[9,10,16],"licens":0,"lifecycl":[6,11],"lifespan":[0,2,6,14],"lift":7,"lightn":4,"lightweight":[4,7],"like":[0,3,4,7,9,10,11,13,14,16],"limit":[1,2,4,6,8,13,15,16],"line":[6,7],"liner":2,"lingua":7,"lint":8,"list":[0,6,7,9,10,13,15],"list_all_us":11,"list_book":[14,15],"list_item":10,"list_pet":10,"list_us":[0,10,12],"list_users_v2":10,"listen":3,"live":[4,8,10,16],"ll":[6,7,10,12,14,15],"load":[0,2,3,4,5,7,10],"load_dotenv":5,"local":[3,5,6,12],"localhost":[4,5,7,9,10,11,14,15,16],"locat":[0,7,11,12],"lock":4,"log":[1,4,6,10,11,13],"log_error":0,"log_level":2,"log_request":13,"log_respons":10,"logic":[6,7,10],"login":[10,11],"logout":11,"long":7,"look":[3,4,6,7],"loop":[7,12,16],"lose":[2,15,16],"lower":[0,5],"lowercas":7,"machin":10,"made":[0,6],"magic":12,"mai":4,"main":[3,8],"make":[4,5,7,8,9,10,11,12,16],"malici":10,"manag":[2,5,6,9,10,11,13,15,16],"mani":[0,4,7,10],"manual":0,"map":[2,7,10,12,15],"mapped_column":15,"mapper":15,"marimo":[2,10],"mark":[2,10],"marker":2,"marshmallow":[0,2,10],"match":[0,5,7,8,10,14],"matter":10,"max_ag":[0,10],"maximum":[0,13],"me":[0,11],"mean":[4,7,10,12],"mechan":10,"media":[0,2,4,6,7,9,10,11,12,14,15],"memori":[0,2,6,7,10],"messag":[0,7,10,11,13,16],"messagepack":[2,6],"metadata":[0,7,8,15],"method":[0,6,7,9,11,12,13,14,15,16],"microservic":10,"middelwar":0,"middlewar":[0,2,6,7,10],"middleware_cl":0,"middleware_config":0,"might":7,"migrat":[2,6,7,10,15],"mime":0,"mimetyp":[0,7,10],"min":[0,10],"mind":13,"minim":[4,16],"minimum":2,"minor":2,"miss":[2,9,10,11],"mix":10,"ml":10,"mobil":11,"mode":[0,4,6],"model":[0,2,6,8,9,10],"model_dump":15,"model_valid":15,"modern":[4,10,11,12],"modifi":[0,10,13,14,15],"modul":[0,2,6,7,10],"monitor":4,"more":[0,3,4,7,10,11,12,13,14,16],"most":[0,3,4,5,7,9,10,11,13,15],"mount":[0,2,6,12],"move":[2,7,10,12],"msgpack":[2,8,10],"much":[7,10],"multi":0,"multipart":[2,7],"multipl":[0,2,4,10,14],"multiplay":[10,16],"must":[0,7,10,11,14,16],"mutabl":6,"mutat":[0,7,12],"my":0,"my_templ":7,"myapi":4,"myapp":[3,4],"mydb":15,"mypi":8,"mysql":15,"n":[0,7],"name":[0,4,5,6,7,9,10,12],"namespac":2,"narrow":2,"nativ":12,"natur":[9,15],"nearli":12,"need":[4,5,6,7,9,10,11,12,13,15,16],"negoti":[0,6,7,8,9],"nervou":7,"network":[9,16],"never":[4,5,10,11,14],"new":[0,7,9,10,12,14,16],"new_endpoint":12,"next":[6,13,16],"next_id":14,"nginx":4,"non":7,"none":[0,2,11,14,15],"nonexist":16,"normal":[0,10,16],"nosniff":13,"notabl":2,"notasecret":0,"note":[7,10,12,14],"notebook":[2,10],"notic":7,"notif":10,"now":[2,7,10,11,15,16],"npm":3,"nullabl":15,"number":[0,7],"o":[0,3,5,7,12],"object":[0,2,7,10,12,13,15,16],"objecttyp":[0,10],"obviou":9,"octet":0,"off":[5,7],"offload":4,"offset":15,"often":[3,7,10],"ok":[0,7,9,14],"old":12,"older":15,"omit":4,"on_delet":10,"on_ev":[0,9,10],"on_get":[6,10],"on_post":[6,10],"on_put":10,"on_request":[6,10],"on_startup":9,"onc":[8,10,12,14],"one":[0,2,5,6,7,10,12,15],"ones":[6,7,10],"onion":13,"onli":[0,5,7,10,12,14],"onmessag":[10,16],"open":[2,7,8,15,16],"open_database_connection_pool":0,"openapi":[0,1,2,6,8,14],"openapi_rout":0,"openapi_them":0,"oper":[7,10,12,14],"opt":10,"option":[0,2,4,6,7,13],"option1":13,"option2":13,"orchestr":4,"order":[0,6],"order_bi":15,"organ":[0,5,9,10,12],"origin":[10,13],"orm":15,"other":[0,2,3,4,6,7,15],"otherwis":[0,10,16],"our":14,"out":[5,6,7,13],"outermost":13,"outgo":[7,10],"output":14,"outsid":13,"over":[0,6,7,10,12,15],"overal":2,"overhead":[9,13],"overrid":[0,10],"overwhelm":10,"own":[4,10,15],"p":[4,11,16],"pace":10,"packag":[2,3,4,8],"page":[0,2,5,7,10,11,16],"pagin":7,"painless":9,"pair":0,"param":[0,2,6,7,12],"paramet":[0,6,9,10,14],"parameter":0,"pars":[0,2,7,9,10],"parser":2,"part":[2,6,7,10],"parti":6,"pass":[0,3,4,7,9,10,12,13,15,16],"passion":6,"password":11,"patch":[7,10],"path":[0,2,3,6,7,9,10,11,13],"path_matches_rout":0,"path_param":[0,2,7],"pattern":[0,4,6,7,8,10,11,12,13,14,15],"payload":11,"pdf":[0,7,9,10],"pep":2,"per":[0,1,4,9,10],"perfect":10,"perfectli":13,"perform":13,"period":[0,2,9,10],"perman":7,"permiss":11,"permit":10,"persist":[0,10,16],"person":6,"pet":[0,10],"petin":10,"petout":10,"petschema":[0,10],"pgdata":4,"photo":10,"piec":10,"pin":[2,4],"pip":[2,3,4,5,6,8,11,15,16],"pipe":4,"place":[5,10],"placehold":[7,16],"plain":[0,7,10,13,16],"platform":[2,3,5,6,7],"pleasant":6,"plot":10,"plu":15,"plugin":2,"poethepoet":2,"point":[3,4,8,14],"polici":[10,13,16],"poll":4,"pool":[0,6,7,10,12,15],"popular":[7,10,15],"port":[0,3,4,5,7,9],"portion":0,"possibl":7,"post":[0,5,7,9,10,11,12,14,15],"postgr":4,"postgres_db":4,"postgres_password":4,"postgres_us":4,"postgresql":[4,6],"potenti":2,"power":[6,9,10,13,15,16],"practic":10,"prefer":10,"prefix":[0,2,10],"present":7,"prevent":[5,10],"price":[0,9,10],"primari":0,"primary_kei":15,"print":[0,5,10,13,15,16],"privat":10,"proce":16,"process":[0,4,6,7,9,10,13],"process_data":7,"procfil":4,"prod":5,"produc":[0,7],"product":[2,3,5,6,7,9,10,11,15],"profil":10,"programmat":10,"progress":10,"project":[2,3],"propag":9,"proper":[7,11,15],"properli":[2,5,9,15,16],"properti":[0,2,7,9],"prose":2,"protect":[4,11],"proto":4,"protocol":[3,7,9,10,13,16],"prototyp":[2,3,6],"provid":0,"proxi":6,"public":[0,6,10],"public_path":11,"pure":6,"push":[1,4,6,10],"put":[6,10,14,15],"py":[2,3,4,5,7,8,9,10,14,15],"pydant":[0,2,6,9,14,15],"pyjwt":11,"pypi":2,"pyproject":[2,8],"pytest":[6,7,8,9,16],"python":[0,2,3,4,5,6,7,10,14,15,16],"pythonpath":3,"q":[0,7,12],"queri":[2,4,6,7,10,15,16],"query_str":0,"querydict":0,"queue":[6,7,8],"quick":[0,3,6],"r":[7,9],"race":9,"railwai":[3,4],"rais":[0,2,9,10,11,16],"raise_server_except":9,"random":[0,5],"rang":[0,7,9,10],"rapidoc":[0,10],"rare":7,"rate":[1,2,4,6,8,13],"rate_limit":0,"ratelimit":[0,2,6,9,10,13],"rather":[9,16],"raw":[0,3,6,7,10,13,15,16],"re":[0,4,7,9,10,12,13,14,16],"reach":[11,13],"react":[2,10],"reactiv":10,"read":[0,2,3,5,6,10,11,12,14,15],"readabl":10,"readi":[4,5,6,7],"real":[2,5,6,7,10,11,14,15,16],"realli":[9,10],"receiv":[0,6,7,9,10,11,13,16],"receive_byt":[10,16],"receive_incom":7,"receive_json":[10,16],"receive_text":[9,10,16],"recommend":10,"reconnect":10,"recv":16,"redirect":[0,2,7,11,12],"redoc":[0,10],"reduc":2,"ref":3,"refactor":[2,9],"refer":[2,6,9],"referr":13,"refresh":15,"refus":10,"regist":[0,9,10,11],"register_blueprint":12,"reject":[1,9,10,16],"relat":[0,10,15],"releas":8,"reliabl":9,"reload":8,"remain":[0,9,10],"rememb":11,"remov":[10,12,14,16],"renam":9,"render":[0,4,6,10],"render_async":7,"render_templ":12,"replac":[2,7,10,14],"repo":8,"report":[7,9,10],"repres":0,"represent":0,"reproduc":4,"req":[0,2,4,6,7,9,10,11,12,13,14,15,16],"request":[1,2,3,4,6,8,11,12,13,14,15],"request_id":[0,2,10,13],"request_model":[0,2,9,10,14,15],"requir":[0,2,4,9,10],"require_rol":11,"research":6,"resolv":[2,10],"resolve_hello":[0,10],"resourc":[7,10,14],"resp":[0,2,4,6,7,9,10,11,12,13,14,15,16],"respect":3,"respond":[0,2,3,4,5,7,8,9,10,11,12,13,14,15,16],"respons":[2,6,8,9,10,12,13,14,15,16],"response_model":[0,2,10,14,15],"rest":[2,4,6,7,10],"restrict":[4,10,11],"result":[0,2,7,10,15],"resum":2,"resume_incomplet":2,"retri":[0,10],"retriev":[0,10,14],"return":[0,2,4,6,7,9,10,11,12,13,14,15],"reusabl":11,"revers":[0,6],"reverse_proxi":4,"revok":11,"rework":2,"rewrit":2,"rewrot":2,"rfc3986":2,"right":[6,7,10,12,13],"role":6,"roll":15,"room":6,"root":[2,10],"rotat":5,"rout":[1,2,4,6,8,9,13,14,15,16],"routegroup":0,"router":[2,8],"rst":2,"ruff":[2,8],"rule":5,"run":[0,2,3,6,9,10,12,13,16],"run_sync":15,"runnabl":8,"runner":[2,4],"runtim":3,"runtimeerror":0,"s3":3,"safe":[2,14],"sai":7,"said":4,"same":[3,4,6,7,10,12,13,14,15],"sandbox":6,"save":[7,16],"scalar":15,"scale":[6,11],"schema":[0,2,6,10,11,14,15],"scope":[0,10,13],"scratch":[6,14],"script":16,"search":[0,2,7,10],"second":0,"secret":[4,6,7,10,11],"secret_kei":[0,3,4,5,10,11],"section":10,"secur":[0,10,13],"securityheadersmiddlewar":13,"see":[0,4,5,7,9,10,13,14,15],"select":[0,2,15],"self":[0,10,11,13],"semant":2,"send":[0,2,6,9,10,11,13,14,16],"send_byt":[10,16],"send_email":0,"send_json":[10,16],"send_text":[9,10,16],"send_with_head":13,"sensit":11,"sent":[0,2,6,7,13],"separ":[7,9,14],"sequenti":2,"serial":[0,2,6,7,10,16],"serializ":7,"serv":[0,2,3,4,5,6,7,9,14,16],"server":[0,1,2,3,4,5,6,8,9,11,13,14,15],"servererrormiddlewar":13,"servestat":2,"servic":[0,3,4,6,9,10,11,14],"session":[0,2,5,6,7,9,12,13,15],"session_id":10,"sessionmiddlewar":13,"set":[0,2,3,4,5,6,7,9,10,11,15,16],"set_cooki":[0,2,10],"set_text":0,"setattr":15,"setup":[2,5,6,9],"sever":[10,13,16],"sftp":3,"sh":4,"shape":10,"share":[0,3,7,9,10,15],"shell":5,"short":[0,1,2,10],"shorthand":0,"should":[4,5,14,15],"shouldn":0,"show":[2,10,12,15,16],"shut":[10,15],"shutdown":[0,4,6,9,10],"shutdwown":2,"sibl":6,"side":[7,10,11,16],"sign":[0,5,6,7,10,11,13],"signatur":[7,10,12],"significantli":4,"signup":11,"simpl":[3,4,9,10,11,13,14,16],"simplecooki":0,"simpler":[7,10,11,13],"simplest":[5,7,11,13,16],"simpli":11,"simplic":[6,15],"simul":7,"sinc":[7,9],"singl":[0,2,3,6,7,8,10,12,15],"sit":13,"size":[0,15],"sk":11,"skip":[0,6,10],"slash":7,"sleep":[7,9],"slim":4,"slow":7,"slowlori":4,"slug":7,"small":[4,6,9,10],"smaller":4,"so":[9,10,11,12,13,14,15],"solv":10,"some":[4,5,10],"some_packag":13,"somemiddlewar":13,"someon":[5,7,10,16],"someth":[6,7,9,10],"sometim":[7,10],"somewher":7,"sourc":[0,5,8,10],"spa":11,"spawn":4,"spec":[7,10],"special":[6,10],"specif":[0,2,5,9,10,11,13,14,16],"specifi":3,"sphinx":8,"spin":7,"split":5,"sprawl":6,"sql":15,"sqlalchemi":[2,6,7,14],"sqlite":[5,15],"sse":[0,2,6],"ssl":4,"stabil":2,"stack":13,"stai":[12,15],"standard":[3,4,10,11,14],"starlett":[0,2,6,9,16],"start":[0,3,4,6,10,11,13,14,15],"startswith":11,"startup":[0,2,6,9,10],"state":[0,2,9,10,11,16],"stateless":11,"statement":6,"static":[0,2,4,6,7,16],"static_app":0,"static_dir":[0,10],"static_rout":[0,2,10],"staticfil":0,"statu":[2,4,6,7,9,10,14],"status_cod":[0,6,7,9,10,11,12,13,14,15],"status_code_saf":0,"stderr":0,"stdlib":2,"still":[10,12],"stop":[8,10],"storag":[3,6],"store":[0,5,10,11,14],"str":[0,7,9,10,11,14,15],"straightforward":10,"stranger":[0,10],"strategi":6,"stream":[0,2,6,10,13],"stream_data":0,"stream_fil":[0,2,10],"strict":[10,13],"string":[0,6,7,10,15,16],"strip":[2,10,11],"structur":[1,10],"style":[10,15],"stylesheet":10,"sub":11,"subclass":0,"subcommand":3,"subject":0,"submiss":0,"submit":0,"subrout":[6,9,10,12],"subsequ":[10,11],"subtl":2,"succe":9,"success":[0,7,14],"successfulli":14,"successor":4,"suit":[8,9],"suppli":2,"support":[0,1,2,3,4,6,7,12,15,16],"swagger":[0,6,10,14],"swagger_ui":[0,10],"swallow":16,"switch":[2,15,16],"sync":[2,6,7,12],"synchron":[0,12],"syntax":[2,6,7,12,15],"synthet":9,"system":[3,4,7,10],"t":[0,4,5,7,9,10,11,12,13,14,15],"tab":16,"tabl":15,"tag":0,"take":[6,7],"tamper":[10,11],"target":2,"task":[0,2,6,8],"teach":6,"tear":10,"tell":[7,10,14,15],"templat":[0,2,6],"template_str":[0,7],"templates_dir":0,"termin":[3,4,16],"terms_of_servic":0,"test":[0,2,3,5,6,7,14],"test_500":[2,9],"test_api":9,"test_create_item":9,"test_custom_error":9,"test_echo":16,"test_flask_mount":9,"test_head":9,"test_hello":9,"test_hook":9,"test_json":9,"test_mount":8,"test_rate_limit":9,"test_respond":8,"test_upload":9,"test_valid":9,"test_websocket":9,"test_websocket_404":16,"test_with_lifespan":9,"testclient":[0,2,9,16],"text":[0,2,6,7,9,10,12,16],"textcont":16,"than":[4,9,10,11,12,13,14,15,16],"thei":[0,5,7,9,10,11,12,13,14,16],"them":[3,4,6,7,9,10,11,12,14,16],"theme":[0,10],"themselv":10,"thi":[0,2,3,4,5,6,7,9,10,11,12,13,14,15,16],"thing":[5,6,7,9,10,13],"think":7,"third":[6,9],"though":4,"thousand":4,"thread":[0,2,6,7,12],"threadpoolexecutor":[0,2],"three":[7,10,16],"through":[0,7,10,13,14,16],"throughput":10,"thu":0,"ti":4,"time":[0,2,6,7,9,10,12,13,14,15,16],"time_start":0,"timedelta":11,"timeout":4,"timezon":11,"timingmiddlewar":13,"tip":[2,6],"titl":[0,2,7,10,14,15],"tl":4,"togeth":[4,6,10],"token":[0,6,7,10,16],"token_hex":5,"toml":[2,8],"too":[0,3,4,9,10],"tool":[4,8,11,13],"toolbelt":2,"toolkit":15,"top":[0,5],"total":10,"tour":[0,6,7],"trace":10,"traceback":[0,2,5,10],"track":15,"tradit":[10,11],"traffic":4,"transact":15,"transform":13,"translat":12,"transport":10,"treat":[0,10],"trick":10,"trigger":9,"true":[0,2,5,7,9,10,11,12,13,15,16],"trust":[2,6,9],"trustedhostmiddlewar":[4,13],"try":[6,7,11,16],"tupl":[0,7,9],"tutori":[2,7,14],"two":[7,9,10,13],"type":[0,2,6,10,12,13,14,15,16],"typic":[7,10],"typo":[2,10],"ui":[0,2,6,10,14],"unauthor":[0,10,11],"under":[0,7,10,12],"underlin":2,"understand":[6,7],"unexpectedli":16,"unhandl":13,"unicod":0,"union":2,"uniqu":10,"unit":15,"univers":5,"unknown":0,"unless":[10,11],"unlik":10,"unmaintain":2,"unmatch":10,"unpin":2,"unprocess":10,"unrecogn":10,"until":7,"up":[0,2,4,7,10],"updat":[2,6,7,10,15,16],"update_book":[14,15],"upgrad":[2,8,10,16],"upload":[0,2,6,7],"url":[0,2,5,6,7,9,10,11,12,13,15],"url_for":[0,2,9],"url_prefix":12,"urllib":2,"us":[0,2,3,4,6,7,10,12,14,16],"usag":[0,2],"user":[0,4,5,7,10,11,12,15],"user_id":[7,10,11,12],"user_rol":11,"usernam":[10,11],"usr":4,"usual":9,"utc":11,"utf":0,"uuid":[0,2,7,10],"uuid4":0,"uv":[3,4,5,6,8,11,15],"uvicorn":[0,2,6,7,13],"uvloop":4,"v":6,"v1":[0,10],"v2":10,"valid":[0,2,6,7,11,13,14,15],"valu":[0,6,7,9,10,11,12,13,14,15,16],"valueerror":[0,9,10,12,14],"var":4,"variabl":[0,4,6,7],"ve":[6,9,12],"venv":8,"verb":10,"veri":[0,7,15],"verif":11,"verifi":[4,9,11],"verify_token":11,"version":[0,2,6,9,10,14],"via":[0,2,4,5,10,12],"view":[0,2,6,7,9,12],"violat":16,"virtual":[3,4],"visit":[10,14],"volum":4,"vue":10,"w":[9,10,16],"wa":[0,2,7,14],"wai":[3,4,6,7,10,11,12,13,15],"wait":[4,12],"walk":[7,10,14],"walkthrough":10,"want":[0,3,4,6,7,9,10,13,14,15,16],"warn":2,"watch":8,"we":[14,15,16],"web":[0,4,6,10,15],"websit":10,"websocket":[0,1,2,4,6,7,13],"websocket_connect":[9,16],"websocketdisconnect":16,"websocketrout":8,"welcom":[6,7,11],"well":[6,11],"went":6,"werkzeug":[2,9],"what":[0,7,9,10,16],"whatev":7,"when":[0,2,3,4,5,6,7,9,10,12,14,15,16],"where":[0,4,7,10,11,15,16],"whether":[0,7],"which":[0,2,7,9,10,12,15],"whichev":6,"while":[7,10,12,16],"whitenois":2,"who":[6,7,11],"widget":[9,10],"wildcard":10,"window":2,"wire":7,"with_app":10,"within":[2,10,15],"without":[0,2,4,7,9,10,11,15],"won":[7,9,10,15],"work":[3,4,5,6,7,10,13,14,15],"workdir":4,"worker":4,"world":[0,3,6,9,10,12],"worri":9,"would":9,"wrap":[0,7,9,10,13],"wrapper":8,"write":[6,7,10,12],"wrong":10,"ws_auth":16,"wsgi":[0,2,4,6,9,10,12],"www":5,"x":[0,4,6,7,9,10,11,12,13,14],"x00":16,"x01":16,"x02":16,"x89png":7,"xml":0,"xss":10,"xv":8,"yaml":[0,2,6,7,8,9,10],"year":[14,15],"yield":[0,10,15],"yml":[0,4,10,11],"you":[0,3,4,5,7,9,10,11,12,13,14,15,16],"your":[0,3,4,5,6,7,9,10,11,12,13,16],"yourself":7,"zero":4},"titles":["API Reference","Backlog","Changelog","Command Line Interface","Deployment","Configuration","Responder","Quick Start","Development Sandbox","Testing","Feature Tour","Authentication","Migrating from Flask","Writing Middleware","Building a REST API","Using SQLAlchemy","WebSocket Tutorial"],"titleterms":{"":14,"0":2,"01":2,"02":2,"03":2,"04":2,"08":2,"09":2,"1":2,"10":2,"11":2,"12":2,"13":2,"15":2,"16":2,"17":2,"18":2,"19":2,"2":2,"20":2,"2018":2,"2019":2,"2026":2,"22":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"In":14,"It":[5,7,14,15],"The":[0,6,12],"access":11,"ad":[2,13],"after":[9,10],"all":[5,7,14],"allow":5,"an":11,"api":[0,9,11,12,14],"app":[9,10,11],"asgi":13,"asset":3,"auth":11,"authent":11,"background":[0,7],"backlog":1,"base":[10,11],"bearer":11,"befor":[9,10,16],"big":12,"blueprint":12,"book":14,"build":[3,14],"built":13,"chang":2,"changelog":2,"chat":16,"check":[4,8],"checklist":4,"choos":11,"class":[0,5,10],"client":16,"cloud":4,"code":[0,8],"command":3,"compos":4,"configur":5,"connect":16,"content":10,"control":11,"convertor":7,"cooki":[9,10],"cor":10,"creat":[7,14],"crud":15,"custom":[3,10,11],"data":16,"databas":15,"debug":5,"defin":[14,15],"delet":14,"deploy":4,"deprec":2,"develop":8,"dict":0,"differ":12,"directli":4,"docker":4,"document":[8,10],"echo":16,"endpoint":[4,15],"env":5,"environ":[3,5],"error":[9,10,11,14],"event":[9,10],"except":11,"featur":10,"file":[3,5,9,10],"filter":10,"fix":2,"fixtur":9,"flask":12,"format":[8,16],"from":[3,12],"frontend":3,"futur":1,"get":[6,9,14],"gradual":12,"graphql":10,"group":[0,10,12],"guid":6,"handl":[9,10,14],"header":9,"health":4,"hello":7,"helper":0,"hook":[9,10,13,16],"host":[5,10],"how":16,"hst":10,"html":16,"id":10,"idea":[1,6],"instal":[6,15],"instanc":3,"interfac":3,"json":[9,12],"kei":[5,11],"launch":3,"layout":8,"lifecycl":16,"lifespan":[9,10,15],"limit":[0,9,10],"line":3,"list":14,"local":4,"memori":14,"messagepack":10,"method":10,"middlewar":13,"migrat":12,"mode":5,"model":[14,15],"modul":3,"mount":[9,10],"name":3,"negoti":10,"next":14,"openapi":10,"order":13,"other":10,"out":14,"paramet":[7,12],"parti":13,"pattern":5,"platform":4,"postgresql":15,"product":4,"project":[6,8,14],"proxi":4,"public":11,"pure":13,"put":[5,7],"pydant":10,"queri":0,"queue":0,"quick":[7,12],"rate":[0,9,10],"read":7,"refer":[0,12],"remov":2,"render":7,"request":[0,7,9,10,16],"respond":6,"respons":[0,7],"rest":14,"revers":4,"role":11,"room":16,"rout":[0,7,10,11,12],"run":[4,7,8,14,15],"sandbox":8,"secret":5,"send":7,"sent":10,"serv":10,"server":[7,10,16],"servic":7,"session":[10,11],"setup":[8,14,15],"shutdown":15,"singl":14,"skip":11,"sqlalchemi":15,"sse":10,"starlett":13,"start":[7,9],"startup":15,"static":10,"statu":0,"storag":14,"strategi":11,"support":10,"task":7,"templat":[7,12],"test":[8,9,16],"third":13,"tip":[9,15],"togeth":[5,7],"token":11,"tour":10,"trust":10,"try":14,"tutori":[6,16],"type":[7,8],"updat":14,"upload":9,"url":3,"us":[5,9,11,13,15],"user":6,"uvicorn":4,"v":13,"v0":2,"v1":2,"v2":2,"v3":2,"valid":[9,10],"variabl":[3,5],"view":10,"web":[7,11],"websocket":[9,10,16],"what":[6,13,14],"when":13,"work":16,"world":7,"write":13,"you":6,"your":[14,15]}}) \ No newline at end of file diff --git a/tutorial-auth.html b/tutorial-auth.html index 328fef8..2a4660a 100644 --- a/tutorial-auth.html +++ b/tutorial-auth.html @@ -80,14 +80,14 @@ common format is JWT (J

    Create a helper to encode and decode tokens:

    import jwt
    -from datetime import datetime, timedelta
    +from datetime import datetime, timedelta, timezone
     
     SECRET = "your-secret-key"
     
     def create_token(user_id: int) -> str:
         payload = {
             "sub": user_id,
    -        "exp": datetime.utcnow() + timedelta(hours=24),
    +        "exp": datetime.now(timezone.utc) + timedelta(hours=24),
         }
         return jwt.encode(payload, SECRET, algorithm="HS256")
     
    @@ -222,6 +222,57 @@ sessions are simpler than tokens. The browser handles cookies automatically
     can’t tamper with it. Don’t store sensitive data like passwords in
     sessions.

    +
    +

    Role-Based Access Control

    +

    For APIs where different users have different permissions, embed the +role in the token and check it in route-specific guards:

    +
    def create_token(user_id: int, role: str = "user") -> str:
    +    payload = {
    +        "sub": user_id,
    +        "role": role,
    +        "exp": datetime.now(timezone.utc) + timedelta(hours=24),
    +    }
    +    return jwt.encode(payload, SECRET, algorithm="HS256")
    +
    +
    +

    Create a helper that checks for a specific role:

    +
    def require_role(*roles):
    +    """Before-request hook factory that restricts by role."""
    +    def check(req, resp):
    +        user_role = getattr(req.state, "role", None)
    +        if user_role not in roles:
    +            resp.status_code = 403
    +            resp.media = {"error": "Insufficient permissions"}
    +    return check
    +
    +
    +

    Use it on specific routes:

    +
    @api.route("/admin/users", before_request=require_role("admin"))
    +def list_all_users(req, resp):
    +    resp.media = {"users": [...]}
    +
    +
    +

    And store the role during token verification:

    +
    # In your auth_guard:
    +req.state.user_id = payload["sub"]
    +req.state.role = payload.get("role", "user")
    +
    +
    +
    +
    +

    Choosing an Auth Strategy

    +
      +
    • API keys — simplest. Good for server-to-server, CLI tools, and +internal services. No expiration unless you build it.

    • +
    • JWT tokens — standard for SPAs and mobile apps. Stateless, so +they scale well. Downside: you can’t revoke them without a blocklist.

    • +
    • Sessions — best for traditional web apps with HTML forms. The +browser manages cookies automatically. Stateful — the server controls +the session lifecycle.

    • +
    +

    Start with API keys for internal tools, JWT for public APIs, and +sessions for web apps with login pages.

    +
    @@ -255,6 +306,8 @@ sessions.

  • Skipping Auth for Public Routes
  • Custom Exception for Auth Errors
  • Using Sessions for Web Apps
  • +
  • Role-Based Access Control
  • +
  • Choosing an Auth Strategy
  • diff --git a/tutorial-sqlalchemy.html b/tutorial-sqlalchemy.html index 6d5f796..63e9dfb 100644 --- a/tutorial-sqlalchemy.html +++ b/tutorial-sqlalchemy.html @@ -63,8 +63,8 @@ MySQL, and any other database SQLAlchemy supports:

    SQLAlchemy models map Python classes to database tables. Each attribute becomes a column:

    # models.py
    -from sqlalchemy import Column, Integer, String
    -from sqlalchemy.orm import DeclarativeBase
    +from sqlalchemy import String
    +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
     
     class Base(DeclarativeBase):
         pass
    @@ -72,16 +72,17 @@ becomes a column:

    class Book(Base): __tablename__ = "books" - id = Column(Integer, primary_key=True, autoincrement=True) - title = Column(String, nullable=False) - author = Column(String, nullable=False) - year = Column(Integer, nullable=False) - isbn = Column(String, nullable=True) + id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + title: Mapped[str] = mapped_column(String, nullable=False) + author: Mapped[str] = mapped_column(String, nullable=False) + year: Mapped[int] = mapped_column(nullable=False) + isbn: Mapped[str | None] = mapped_column(String, nullable=True)
    -

    DeclarativeBase is SQLAlchemy’s modern base class (SQLAlchemy 2.0+). -Each model class corresponds to a table, and each Column corresponds -to a column in that table.

    +

    This uses SQLAlchemy 2.0’s Mapped type annotations and +mapped_column(), which give you type checker support and cleaner +syntax than the older Column() style. Each model class corresponds +to a table, and each mapped_column() corresponds to a column.

    Database Setup

    diff --git a/tutorial-websockets.html b/tutorial-websockets.html index dff74b1..b0801a7 100644 --- a/tutorial-websockets.html +++ b/tutorial-websockets.html @@ -91,7 +91,9 @@ ws.close()

    A chat room needs to broadcast messages to all connected clients. We keep a set of active connections and iterate through them when someone sends a message:

    -
    connected = set()
    +
    from starlette.websockets import WebSocketDisconnect
    +
    +connected = set()
     
     @api.route("/chat", websocket=True)
     async def chat(ws):
    @@ -103,14 +105,16 @@ a message:

    # Broadcast to all connected clients for client in connected: await client.send_text(message) - except Exception: + except WebSocketDisconnect: pass finally: connected.discard(ws)

    The try/finally block ensures we remove disconnected clients from -the set, even if the connection drops unexpectedly.

    +the set, even if the connection drops unexpectedly. Catching +WebSocketDisconnect specifically (rather than bare Exception) +makes the intent clear and avoids swallowing real bugs.

    Data Formats

    @@ -179,6 +183,38 @@ HTTP before-request hooks. This is useful for authentication:

    WebSocket before-request hooks receive the ws object and must call await ws.accept() if they want the connection to proceed.

    +
    +

    Connection Lifecycle

    +

    WebSocket connections go through several states:

    +
      +
    1. Connecting — the client sends an upgrade request

    2. +
    3. Open — after await ws.accept(), both sides can send messages

    4. +
    5. Closing — either side initiates a close handshake

    6. +
    7. Closed — the connection is fully terminated

    8. +
    +

    When a client disconnects (closes the tab, loses network), the next +await ws.receive_text() raises WebSocketDisconnect. Always +handle this — otherwise your server accumulates dead connections:

    +
    from starlette.websockets import WebSocketDisconnect
    +
    +@api.route("/ws", websocket=True)
    +async def handler(ws):
    +    await ws.accept()
    +    try:
    +        while True:
    +            data = await ws.receive_text()
    +            await ws.send_text(f"Got: {data}")
    +    except WebSocketDisconnect:
    +        print("Client disconnected")
    +
    +
    +

    You can also close connections from the server side:

    +
    await ws.close(code=1000)  # 1000 = normal closure
    +
    +
    +

    Common close codes: 1000 (normal), 1001 (going away), +1008 (policy violation), 1011 (server error).

    +

    Testing WebSockets

    Use Starlette’s TestClient for WebSocket tests:

    @@ -193,6 +229,16 @@ HTTP before-request hooks. This is useful for authentication:

    The websocket_connect context manager handles the connection lifecycle — it connects on enter and disconnects on exit.

    +

    You can also test that connections are properly rejected:

    +
    from starlette.websockets import WebSocketDisconnect
    +
    +def test_websocket_404():
    +    client = TestClient(api)
    +    with pytest.raises(WebSocketDisconnect):
    +        with client.websocket_connect("/nonexistent"):
    +            pass
    +
    +
    @@ -228,6 +274,7 @@ lifecycle — it connects on enter and disconnects on exit.

  • Data Formats
  • HTML Client
  • Before-Request Hooks for WebSockets
  • +
  • Connection Lifecycle
  • Testing WebSockets