From bbd2198fa2c7fa8a61c282553a5e8c5ed49de2ec Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 2 Mar 2019 21:45:15 +0400 Subject: [PATCH] :sparkles: Add docs for WebSockets (#62) --- docs/img/tutorial/websockets/image01.png | Bin 0 -> 17229 bytes docs/img/tutorial/websockets/image02.png | Bin 0 -> 18326 bytes docs/img/tutorial/websockets/image03.png | Bin 0 -> 21283 bytes docs/img/tutorial/websockets/image04.png | Bin 0 -> 30900 bytes docs/src/websockets/tutorial001.py | 53 +++++++++++++ docs/tutorial/websockets.md | 93 +++++++++++++++++++++++ mkdocs.yml | 1 + 7 files changed, 147 insertions(+) create mode 100644 docs/img/tutorial/websockets/image01.png create mode 100644 docs/img/tutorial/websockets/image02.png create mode 100644 docs/img/tutorial/websockets/image03.png create mode 100644 docs/img/tutorial/websockets/image04.png create mode 100644 docs/src/websockets/tutorial001.py create mode 100644 docs/tutorial/websockets.md diff --git a/docs/img/tutorial/websockets/image01.png b/docs/img/tutorial/websockets/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..c6de53b56c73c6be490f38c145cc197373dada78 GIT binary patch literal 17229 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 HZ{Gh8tOi?e literal 0 Hc-jL100001 diff --git a/docs/img/tutorial/websockets/image02.png b/docs/img/tutorial/websockets/image02.png new file mode 100644 index 0000000000000000000000000000000000000000..84e2d6ad724005e112613cbcf73224fdcba4384d GIT binary patch literal 18326 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 DAtdi! literal 0 Hc-jL100001 diff --git a/docs/img/tutorial/websockets/image03.png b/docs/img/tutorial/websockets/image03.png new file mode 100644 index 0000000000000000000000000000000000000000..31b2110afc8281046d20eb289e4cc332fe90d5ee GIT binary patch literal 21283 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 E0R$H-t^fc4 literal 0 Hc-jL100001 diff --git a/docs/src/websockets/tutorial001.py b/docs/src/websockets/tutorial001.py new file mode 100644 index 0000000000..2713550d36 --- /dev/null +++ b/docs/src/websockets/tutorial001.py @@ -0,0 +1,53 @@ +from fastapi import FastAPI +from starlette.responses import HTMLResponse +from starlette.websockets import WebSocket + +app = FastAPI() + +html = """ + + + + Chat + + +

WebSocket Chat

+
+ + +
+
    +
+ + + +""" + + +@app.get("/") +async def get(): + return HTMLResponse(html) + + +@app.websocket_route("/ws") +async def websocket_endpoint(websocket: WebSocket): + await websocket.accept() + while True: + data = await websocket.receive_text() + await websocket.send_text(f"Message text was: {data}") + await websocket.close() diff --git a/docs/tutorial/websockets.md b/docs/tutorial/websockets.md new file mode 100644 index 0000000000..703f57aa12 --- /dev/null +++ b/docs/tutorial/websockets.md @@ -0,0 +1,93 @@ + +You can use WebSockets with **FastAPI**. + +## WebSockets client + +### In production + +In your production system, you probably have a frontend created with a modern framework like React, Vue.js or Angular. + +And to communicate using WebSockets with your backend you would probably use your frontend's utilities. + +Or you might have a native mobile application that communicates with your WebSocket backend directly, in native code. + +Or you might have any other way to communicate with the WebSocket endpoint. + +--- + +But for this example, we'll use a very simple HTML document with some JavaScript, all inside a long string. + +This, of course, is not optimal and you wouldn't use it for production. + +In production you would have one of the options above. + +But it's the simplest way to focus on the server-side of WebSockets and have a working example: + +```Python hl_lines="2 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 42 43 44" +{!./src/websockets/tutorial001.py!} +``` + +## Create a `websocket_route` + +In your **FastAPI** application, create a `websocket_route`: + +```Python hl_lines="3 47 48" +{!./src/websockets/tutorial001.py!} +``` + +!!! tip + In this example we are importing `WebSocket` from `starlette.websockets` to use it in the type declaration in the WebSocket route function. + + That is not required, but it's recommended as it will provide you completion and checks inside the function. + + +!!! info + This `websocket_route` we are using comes directly from Starlette. + + That's why the naming convention is not the same as with other API path operations (`get`, `post`, etc). + + +## Await for messages and send messages + +In your WebSocket route you can `await` for messages and send messages. + +```Python hl_lines="49 50 51 52 53" +{!./src/websockets/tutorial001.py!} +``` + +You can receive and send binary, text, and JSON data. + +To learn more about the options, check Starlette's documentation for: + +* Applications (`websocket_route`). +* The `WebSocket` class. +* Class-based WebSocket handling. + + +## Test it + +If your file is named `main.py`, run your application with: + +```bash +uvicorn main:app --debug +``` + +Open your browser at http://127.0.0.1:8000. + +You will see a simple page like: + + + +You can type messages in the input box, and send them: + + + +And your **FastAPI** application with WebSockets will respond back: + + + +You can send (and receive) many messages: + + + +And all of them will use the same WebSocket connection. diff --git a/mkdocs.yml b/mkdocs.yml index 432a23051b..2760194af8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -62,6 +62,7 @@ nav: - Sub Applications - Behind a Proxy: 'tutorial/sub-applications-proxy.md' - Application Configuration: 'tutorial/application-configuration.md' - GraphQL: 'tutorial/graphql.md' + - WebSockets: 'tutorial/websockets.md' - Debugging: 'tutorial/debugging.md' - Concurrency and async / await: 'async.md' - Deployment: 'deployment.md' -- 2.47.3