pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6304 lines
440 KiB
6304 lines
440 KiB
{
|
|
"drawioXML": "<mxfile>\n <diagram id=\"6dGLu9Cl6Tjgd9O9yrUu\" name=\"Page-1\">\n <mxGraphModel dx=\"16478\" dy=\"9166\" grid=\"0\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"0\" arrows=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"850\" pageHeight=\"1100\" math=\"0\" shadow=\"0\">\n <root>\n <mxCell id=\"0\" />\n <mxCell id=\"1\" style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" parent=\"0\" />\n <UserObject label=\"docs_src\" value=\"docs_src\" id=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=55;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" parent=\"1\" vertex=\"1\">\n <mxGeometry x=\"195\" y=\"1270.304600983885\" width=\"3540\" height=\"4086.750745187711\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"first_steps\" value=\"first_steps\" id=\"155fc4f9-e909-433d-bb96-a4501896f906\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"2860\" y=\"70\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial001.py\" value=\"tutorial001.py\" id=\"ff477659-d236-42a7-8bca-c39417c94ba3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"155fc4f9-e909-433d-bb96-a4501896f906\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Define Endpoint on FastAPI App - tutorial001.py:L5-9\" value=\"Flow 1: Define Endpoint on FastAPI App - tutorial001.py:L5-9\" id=\"2b5e7ff6-1868-48b8-9702-5e22aafa2516\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"ff477659-d236-42a7-8bca-c39417c94ba3\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"bigger_applications\" value=\"bigger_applications\" id=\"8b330f7a-5ce6-4249-954b-560570e6efab\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=46;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"118.43867237416498\" width=\"2230\" height=\"907.1468757489649\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"app\" value=\"app\" id=\"ced0be04-1104-44cf-9102-bd03eb76b5fc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=45;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"8b330f7a-5ce6-4249-954b-560570e6efab\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"2040\" height=\"767.1468757489649\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"routers\" value=\"routers\" id=\"24b16353-49e5-4230-9464-c645c55926e0\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=34;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" parent=\"ced0be04-1104-44cf-9102-bd03eb76b5fc\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"1020\" height=\"514.3967842035571\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"users.py\" value=\"users.py\" id=\"26a92877-c137-468e-a7e8-766790d0a44c\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" parent=\"24b16353-49e5-4230-9464-c645c55926e0\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"360.24710152500006\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Define Endpoints in a Router Module - users.py:L1-11\" value=\"Define Endpoints in a Router Module - users.py:L1-11\" id=\"926aa4a2-9860-4054-a8d3-58d1bad36a26\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"26a92877-c137-468e-a7e8-766790d0a44c\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Define User-Related Routes - users.py:L3-8\" value=\"Define User-Related Routes - users.py:L3-8\" id=\"603b4eb9-d4e5-4d23-b806-e5d29565c715\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"26a92877-c137-468e-a7e8-766790d0a44c\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"200.24710152500003\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"items.py\" value=\"items.py\" id=\"b61db9f9-9cf6-428b-9da7-92da54855cd7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" parent=\"24b16353-49e5-4230-9464-c645c55926e0\" vertex=\"1\">\n <mxGeometry x=\"605\" y=\"214.39678420355713\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Define Item Router with Shared Configuration - items.py:L5-10\" value=\"Define Item Router with Shared Configuration - items.py:L5-10\" id=\"f9a14e30-e10d-4e53-a595-158cce2646a0\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"b61db9f9-9cf6-428b-9da7-92da54855cd7\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"39f855f0-2d15-4865-90bf-cce2d20bb759\" value=\"User Router
Object Created\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=12;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"24b16353-49e5-4230-9464-c645c55926e0\" source=\"603b4eb9-d4e5-4d23-b806-e5d29565c715\" target=\"f9a14e30-e10d-4e53-a595-158cce2646a0\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"480\" y=\"315.24710152500006\" />\n <mxPoint x=\"480\" y=\"329.39678420355716\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"main.py\" value=\"main.py\" id=\"8f4c6c49-0848-4c53-942f-8faa44426856\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=28;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" parent=\"ced0be04-1104-44cf-9102-bd03eb76b5fc\" vertex=\"1\">\n <mxGeometry x=\"1305\" y=\"337.14687574896493\" width=\"640\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create Main FastAPI Application - main.py:L8\" value=\"Create Main FastAPI Application - main.py:L8\" id=\"906297f0-cfb7-4c0f-b6cf-47ee77938360\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"8f4c6c49-0848-4c53-942f-8faa44426856\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Include Routers into the Main App - main.py:L11-12\" value=\"Include Routers into the Main App - main.py:L11-12\" id=\"4007f37b-ba49-4437-918a-380bc8859f5a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"8f4c6c49-0848-4c53-942f-8faa44426856\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"82.26221567682492\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Include Router with Overriding Configuration - main.py:L13-18\" value=\"Include Router with Overriding Configuration - main.py:L13-18\" id=\"da65836d-fde5-450b-a63f-8856ed4ef131\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"8f4c6c49-0848-4c53-942f-8faa44426856\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"200.00000000000003\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"5e1e692a-53ef-4b61-9274-643796cecc8e\" value=\"App Instance
Ready for
Routers\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"8f4c6c49-0848-4c53-942f-8faa44426856\" source=\"906297f0-cfb7-4c0f-b6cf-47ee77938360\" target=\"4007f37b-ba49-4437-918a-380bc8859f5a\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"115\" />\n <mxPoint x=\"290\" y=\"127.26221567682492\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"eff4590a-a5ea-4a00-b6ff-d997c92439f0\" value=\"Item Router
Object Created\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=17;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"ced0be04-1104-44cf-9102-bd03eb76b5fc\" source=\"f9a14e30-e10d-4e53-a595-158cce2646a0\" target=\"906297f0-cfb7-4c0f-b6cf-47ee77938360\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1180\" y=\"399.3967842035572\" />\n <mxPoint x=\"1180\" y=\"452.14687574896504\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"body\" value=\"body\" id=\"1ba21140-0832-45ce-9c42-8dceb9ee9610\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"2860\" y=\"2434.914104311577\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial001.py\" value=\"tutorial001.py\" id=\"cf9f8228-b360-4073-ad8a-031b4bfb5b8a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"1ba21140-0832-45ce-9c42-8dceb9ee9610\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Request Validation: Define Pydantic Model for Request Body - tutorial001.py:L6-10\" value=\"Request Validation: Define Pydantic Model for Request Body - tutorial001.py:L6-10\" id=\"4bb82a78-f30e-4b1c-a69e-164917cfc206\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"cf9f8228-b360-4073-ad8a-031b4bfb5b8a\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"response_model\" value=\"response_model\" id=\"a107d9fc-610a-46cb-b276-e20da1ef1d7f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=31;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"795\" y=\"2009.8282149161937\" width=\"830\" height=\"370.7789018663125\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial003.py\" value=\"tutorial003.py\" id=\"07829d93-9e93-4a1f-8c08-721c2e82ec45\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=28;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"a107d9fc-610a-46cb-b276-e20da1ef1d7f\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"640\" height=\"230.7789018663125\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Response Serialization: Define Input and Output Models - tutorial003.py:L8-19\" value=\"Response Serialization: Define Input and Output Models - tutorial003.py:L8-19\" id=\"d6492e72-b011-4de7-8256-7267f17c1ca3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"07829d93-9e93-4a1f-8c08-721c2e82ec45\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Response Serialization: Return Data from Endpoint - tutorial003.py:L22-23\" value=\"Response Serialization: Return Data from Endpoint - tutorial003.py:L22-23\" id=\"bd740fd1-a54f-4634-81fc-78b0ed1642ad\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"07829d93-9e93-4a1f-8c08-721c2e82ec45\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"70.77890186631251\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"650381df-eef9-40df-9b05-777389c18054\" value=\"Response Serialization:
Set `response_model`
on Decorator\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"07829d93-9e93-4a1f-8c08-721c2e82ec45\" source=\"d6492e72-b011-4de7-8256-7267f17c1ca3\" target=\"bd740fd1-a54f-4634-81fc-78b0ed1642ad\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"115\" />\n <mxPoint x=\"290\" y=\"115.77890186631251\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"dependency_testing\" value=\"dependency_testing\" id=\"1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=31;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"2515\" y=\"2914.310332785709\" width=\"830\" height=\"630\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial001.py\" value=\"tutorial001.py\" id=\"2b02df7f-6022-4e24-9de1-76f9379fee9a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=28;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"640\" height=\"490\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Registering a Dependency Override - tutorial001.py:L31\" value=\"Registering a Dependency Override - tutorial001.py:L31\" id=\"e72088ee-22e5-4463-b5ff-1eaafe569f93\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2b02df7f-6022-4e24-9de1-76f9379fee9a\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Set Dependency Override - tutorial001.py:L32\" value=\"Set Dependency Override - tutorial001.py:L32\" id=\"38c3f10f-2301-458f-8ea1-2c20041c520a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2b02df7f-6022-4e24-9de1-76f9379fee9a\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Make Request to Endpoint with Overridden Dependency - tutorial001.py:L36\" value=\"Make Request to Endpoint with Overridden Dependency - tutorial001.py:L36\" id=\"71af56b2-6d44-43a3-a912-2a66fa6e854c\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2b02df7f-6022-4e24-9de1-76f9379fee9a\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"198.79374238661904\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Assert Response with Mocked Data - tutorial001.py:L37-39\" value=\"Assert Response with Mocked Data - tutorial001.py:L37-39\" id=\"0627101a-26d2-4e87-86b0-ab6e9c5e83ad\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2b02df7f-6022-4e24-9de1-76f9379fee9a\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"330\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"ea2a2c4d-e465-4003-8375-a3c644eea489\" value=\"Override Stored
in App\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"2b02df7f-6022-4e24-9de1-76f9379fee9a\" source=\"38c3f10f-2301-458f-8ea1-2c20041c520a\" target=\"71af56b2-6d44-43a3-a912-2a66fa6e854c\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"245\" />\n <mxPoint x=\"290\" y=\"243.79374238661904\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"security\" value=\"security\" id=\"18cdfb57-624d-48d1-a684-e2ea2cc4267d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=31;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"795\" y=\"3515.370308105475\" width=\"830\" height=\"501.3804370822358\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial002_an_py310.py\" value=\"tutorial002_an_py310.py\" id=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=28;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"18cdfb57-624d-48d1-a684-e2ea2cc4267d\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"640\" height=\"361.3804370822358\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Config: Define OAuth2 Security Scheme - tutorial002_an_py310.py:L9\" value=\"Config: Define OAuth2 Security Scheme - tutorial002_an_py310.py:L9\" id=\"75f350d9-2d38-490b-a819-4ca969223fcb\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"201.3804370822358\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Config: Protect Endpoint with `get_current_user` Dependency - tutorial002_an_py310.py:L31-32\" value=\"Config: Protect Endpoint with `get_current_user` Dependency - tutorial002_an_py310.py:L31-32\" id=\"0d3536ce-f083-416f-9777-ab87be3805ba\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"200.29296353622993\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Business Logic: Retrieve User from Token - tutorial002_an_py310.py:L26-27\" value=\"Business Logic: Retrieve User from Token - tutorial002_an_py310.py:L26-27\" id=\"8f262716-e919-4f69-9c85-095021269fa5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"71.13747589473584\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Business Logic: Execute Endpoint Logic - tutorial002_an_py310.py:L32\" value=\"Business Logic: Execute Endpoint Logic - tutorial002_an_py310.py:L32\" id=\"65ee418b-cdcf-4852-b605-afa3d1f990aa\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"253c3208-f450-42d2-9077-3f3ade4fcdaf\" value=\"Dependency Injection:
Provide Scheme
as a
Dependency\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\" source=\"75f350d9-2d38-490b-a819-4ca969223fcb\" target=\"0d3536ce-f083-416f-9777-ab87be3805ba\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"246.3804370822358\" />\n <mxPoint x=\"290\" y=\"245.29296353622993\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"31b1cc97-11e9-49ad-a4d3-212f95564fbc\" value=\"Dependency Injection:
Inject User
Object into
Path Operation\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"06adf03b-ecd6-4392-a5eb-c8ef4f064794\" source=\"8f262716-e919-4f69-9c85-095021269fa5\" target=\"65ee418b-cdcf-4852-b605-afa3d1f990aa\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"116.13747589473584\" />\n <mxPoint x=\"290\" y=\"115\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"body_multiple_params\" value=\"body_multiple_params\" id=\"709ed4a5-434c-4f99-b716-0545f49e52c6\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"955\" y=\"2429.4126163289743\" width=\"510\" height=\"500.23526566400005\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial003.py\" value=\"tutorial003.py\" id=\"f2ee5d12-0dd3-4bdf-a7d9-f06233086074\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"709ed4a5-434c-4f99-b716-0545f49e52c6\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"360.23526566400005\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Define Path Operation with Parameter Validation - tutorial003.py:L9-24\" value=\"Define Path Operation with Parameter Validation - tutorial003.py:L9-24\" id=\"3272394c-4b6b-4e76-872d-d6916dc99c37\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"f2ee5d12-0dd3-4bdf-a7d9-f06233086074\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"200.235265664\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Execute Path Operation Function - tutorial003.py:L9-24\" value=\"Execute Path Operation Function - tutorial003.py:L9-24\" id=\"53058048-3874-442b-a561-6a04804417d7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"f2ee5d12-0dd3-4bdf-a7d9-f06233086074\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"async_tests\" value=\"async_tests\" id=\"2e0c66ab-b7e0-4b05-8614-eca7ab5cca17\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"2860\" y=\"765.7220018501357\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"main.py\" value=\"main.py\" id=\"aa72b614-49af-48c1-a5c3-3bc1b45981e5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"2e0c66ab-b7e0-4b05-8614-eca7ab5cca17\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"1. Define an Asynchronous Path Operation - main.py:L6-9\" value=\"1. Define an Asynchronous Path Operation - main.py:L6-9\" id=\"6d538c95-7002-4e13-a58e-42276e93a916\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"aa72b614-49af-48c1-a5c3-3bc1b45981e5\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"app_testing\" value=\"app_testing\" id=\"6dc9040b-9a18-4adc-9e48-8101ad662c99\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=40;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"880\" y=\"3030.6478819929744\" width=\"1445\" height=\"383.7224261125\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial001.py\" value=\"tutorial001.py\" id=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=37;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"6dc9040b-9a18-4adc-9e48-8101ad662c99\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"1280\" height=\"243.7224261125\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Instantiate TestClient - tutorial001.py:L12\" value=\"Instantiate TestClient - tutorial001.py:L12\" id=\"bf1edc05-08ee-4c1c-80cf-21b4f531e0fe\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"83.72242611249999\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Make a Request with TestClient - tutorial001.py:L16\" value=\"Make a Request with TestClient - tutorial001.py:L16\" id=\"1c4e4a6c-1cb3-4852-986c-ea94a4fff224\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"83.72242611250002\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Execute Path Operation Function - tutorial001.py:L8-10\" value=\"Execute Path Operation Function - tutorial001.py:L8-10\" id=\"57c79588-0531-4abc-b526-cf50845249a7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" vertex=\"1\">\n <mxGeometry x=\"710\" y=\"83.7224261125\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Assert Response in Test - tutorial001.py:L17-18\" value=\"Assert Response in Test - tutorial001.py:L17-18\" id=\"970abd06-2dc8-4102-8055-8933609aeb67\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" vertex=\"1\">\n <mxGeometry x=\"1030\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"1d40db3a-214d-4571-a103-38478d8d830a\" value=\"Application Passed
to TestClient\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" source=\"bf1edc05-08ee-4c1c-80cf-21b4f531e0fe\" target=\"1c4e4a6c-1cb3-4852-986c-ea94a4fff224\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <mxCell id=\"0a7b0cb1-c602-4466-a1e8-6f2b076c75f5\" value=\"Request Dispatched
to FastAPI
App\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" source=\"1c4e4a6c-1cb3-4852-986c-ea94a4fff224\" target=\"57c79588-0531-4abc-b526-cf50845249a7\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <mxCell id=\"a28abe3f-2890-4751-a4c2-042299a647a1\" value=\"Response Returned
to TestClient\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"43fe865e-b2ad-4d4a-963c-35618fc3cdda\" source=\"57c79588-0531-4abc-b526-cf50845249a7\" target=\"970abd06-2dc8-4102-8055-8933609aeb67\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"930\" y=\"128.7224261125\" />\n <mxPoint x=\"930\" y=\"115\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"cebf7614-db24-432b-869f-fd8c57568bf7\" value=\"Transition to
Dependency Override\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" source=\"970abd06-2dc8-4102-8055-8933609aeb67\" target=\"38c3f10f-2301-458f-8ea1-2c20041c520a\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2390\" y=\"3215.6478819929735\" />\n <mxPoint x=\"2390\" y=\"3229.3103327857084\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"handling_errors\" value=\"handling_errors\" id=\"7f9cc00d-55b1-43c7-926c-8cea814fb472\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=37;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e\" vertex=\"1\">\n <mxGeometry x=\"595\" y=\"1065.58554812313\" width=\"1230\" height=\"900\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial001.py\" value=\"tutorial001.py\" id=\"d35761a9-d525-4ba8-a82f-27021eff54c0\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"7f9cc00d-55b1-43c7-926c-8cea814fb472\" vertex=\"1\">\n <mxGeometry x=\"735\" y=\"70.00000000000003\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Path Operation Raises HTTPException - tutorial001.py:L11-12\" value=\"Flow 1: Path Operation Raises HTTPException - tutorial001.py:L11-12\" id=\"cc96ff59-f849-4fc3-8c77-3c015a9af800\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"d35761a9-d525-4ba8-a82f-27021eff54c0\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tutorial004.py\" value=\"tutorial004.py\" id=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=31;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"7f9cc00d-55b1-43c7-926c-8cea814fb472\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"470\" width=\"960\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: Invalid Request Data Received - tutorial004.py:L22\" value=\"Flow 2: Invalid Request Data Received - tutorial004.py:L22\" id=\"aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 3: Define and Register Custom Handlers - tutorial004.py:L9-18\" value=\"Flow 3: Define and Register Custom Handlers - tutorial004.py:L9-18\" id=\"ca47235c-5df6-4452-a574-2e6e3aa67b1b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"199.99999999999997\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 3: Custom Handler is Invoked - tutorial004.py:L15-18\" value=\"Flow 3: Custom Handler is Invoked - tutorial004.py:L15-18\" id=\"2fac3163-54f8-456c-890c-17c6430e406d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\" vertex=\"1\">\n <mxGeometry x=\"390\" y=\"196.44459578467183\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 3: Custom Response is Generated - tutorial004.py:L17-18\" value=\"Flow 3: Custom Response is Generated - tutorial004.py:L17-18\" id=\"4422434a-fd9d-4a7f-bae3-d67280e39a7e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\" vertex=\"1\">\n <mxGeometry x=\"710\" y=\"196.44459578467183\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"f264e35a-3ede-4cd4-a4f3-5468def4eef0\" value=\"Flow 3:
Exception Triggered
and Caught\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\" source=\"ca47235c-5df6-4452-a574-2e6e3aa67b1b\" target=\"2fac3163-54f8-456c-890c-17c6430e406d\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"244.99999999999997\" />\n <mxPoint x=\"290\" y=\"241.44459578467183\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"f63e7186-ed41-432f-b2f3-4ede5013e529\" value=\"Flow 3:
Delegate to
Default Handler
(Reuse Pattern)\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f\" source=\"2fac3163-54f8-456c-890c-17c6430e406d\" target=\"4422434a-fd9d-4a7f-bae3-d67280e39a7e\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <UserObject label=\"tutorial006.py\" value=\"tutorial006.py\" id=\"a01899f9-de7d-4a39-8f81-ae24c94c1008\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=16;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f9cc00d-55b1-43c7-926c-8cea814fb472\" vertex=\"1\">\n <mxGeometry x=\"485\" y=\"340.00000000000006\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"fastapi\" value=\"fastapi\" id=\"e3327eea-4b00-4760-81fc-439223e65b7b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=55;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" parent=\"1\" vertex=\"1\">\n <mxGeometry x=\"3925\" y=\"1119.9999999999995\" width=\"3700\" height=\"3983.395627651646\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"applications.py\" value=\"applications.py\" id=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"206.42857142857144\" y=\"417.8880878045439\" width=\"480\" height=\"1270\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Route Registration - applications.py:L1877-1885\" value=\"Route Registration - applications.py:L1877-1885\" id=\"6e05ecc7-7adb-4cc0-907f-c9cd89754215\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Merge Router into Application - applications.py:L1505-1513\" value=\"Merge Router into Application - applications.py:L1505-1513\" id=\"a4a492b6-cd0a-4b76-a068-6332c88f2780\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"720\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Swagger Docs Flow: Receive Request for Swagger UI - applications.py:L1094-1101\" value=\"Swagger Docs Flow: Receive Request for Swagger UI - applications.py:L1094-1101\" id=\"e4a59297-1264-44a9-898c-4dee94711ce9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"330.00000000000006\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079\" value=\"Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079\" id=\"40a4dbed-c500-4e10-8576-a6a3c6e89f42\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"200.00000000000003\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"ReDoc Flow: Receive Request for ReDoc UI - applications.py:L1117-1123\" value=\"ReDoc Flow: Receive Request for ReDoc UI - applications.py:L1117-1123\" id=\"b7f04727-ddee-4e7f-aa93-9b248246cb43\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"590\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079\" value=\"Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079\" id=\"a0ec126e-9261-47be-8bfd-46fe40ae350d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"460\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Application Initialization - applications.py:L945-953\" value=\"Application Initialization - applications.py:L945-953\" id=\"f6bb6d10-45ca-4e81-871f-780dea9a7305\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"980\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"3. ASGI Server Receives Request - applications.py:L1131-1134\" value=\"3. ASGI Server Receives Request - applications.py:L1131-1134\" id=\"723adc58-e008-43e8-a4a5-f27f1e5b9b72\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"1110\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Default Exception Handler Invoked - applications.py:L981-982\" value=\"Flow 1: Default Exception Handler Invoked - applications.py:L981-982\" id=\"dc65b6d2-aebe-4270-a674-6ac2fb83c227\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"7f6f82df-82d2-40de-96d9-e51093e8ee57\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"850\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"routing.py\" value=\"routing.py\" id=\"bc147214-42a2-42c3-a92c-ed7b8996b912\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=37;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"885\" y=\"1602.3956276516462\" width=\"1360\" height=\"1270.0000000000002\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Request Validation: Receive and Read Request Body - routing.py:L328-330\" value=\"Request Validation: Receive and Read Request Body - routing.py:L328-330\" id=\"e3b022ed-3b88-44a1-8ece-42671ec7f9d5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"1110.0000000000002\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Response Serialization: Serialize and Filter Response Data - routing.py:L411-417\" value=\"Response Serialization: Serialize and Filter Response Data - routing.py:L411-417\" id=\"4d193d20-5a44-4123-894a-3ee686cdc355\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"980.0000000000002\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Route and Dependency Analysis - routing.py:L629\" value=\"Route and Dependency Analysis - routing.py:L629\" id=\"ffe256a7-70ab-40e0-b789-c9b6baaae7c3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"460.00000000000006\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Initiating Dependency Resolution - routing.py:L377-384\" value=\"Initiating Dependency Resolution - routing.py:L377-384\" id=\"7311e683-4633-41fe-94d6-cd7f59f20fc0\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"720.0000000000001\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Injecting Value into Endpoint - routing.py:L389\" value=\"Injecting Value into Endpoint - routing.py:L389\" id=\"149c1867-ad1b-4774-97a5-51df12cae15c\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Extract Raw Data from Request - routing.py:L333-371\" value=\"Extract Raw Data from Request - routing.py:L333-371\" id=\"1528bb9f-0a02-44f7-8fb9-f12c89cff357\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"850.0000000000001\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"5. Select Handler based on Function Type - routing.py:L95-97\" value=\"5. Select Handler based on Function Type - routing.py:L95-97\" id=\"4d253d9a-189a-4b27-bb06-5862fbba7283\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"590\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"7. Await the Coroutine Endpoint - routing.py:L287-288\" value=\"7. Await the Coroutine Endpoint - routing.py:L287-288\" id=\"5be4df9c-50fb-41d0-a436-85a1be744dc5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"470\" y=\"590.4789322797856\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"9. Serialize the Response - routing.py:L408-415\" value=\"9. Serialize the Response - routing.py:L408-415\" id=\"3b4760d0-0289-4c64-9a67-b0b7911cb094\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"790\" y=\"590.4789322797856\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"11. Send HTTP Response via ASGI - routing.py:L106\" value=\"11. Send HTTP Response via ASGI - routing.py:L106\" id=\"b74d9193-26b0-4b98-a1dc-e55e17c8a0e4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"1110\" y=\"590.4789322797856\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"badccb56-99c5-43c0-8a2b-d49fb9b2c1cd\" value=\"6. Prepare
Endpoint Execution\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" source=\"4d253d9a-189a-4b27-bb06-5862fbba7283\" target=\"5be4df9c-50fb-41d0-a436-85a1be744dc5\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"370\" y=\"635\" />\n <mxPoint x=\"370\" y=\"635.4789322797856\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"7c922d0b-5375-43f1-9ee5-5129e67ae842\" value=\"8. Raw
Response Returned\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" source=\"5be4df9c-50fb-41d0-a436-85a1be744dc5\" target=\"3b4760d0-0289-4c64-9a67-b0b7911cb094\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <mxCell id=\"3bd58e0f-f6e9-402f-9597-cee988b040b1\" value=\"10. Create
Response Object\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" source=\"3b4760d0-0289-4c64-9a67-b0b7911cb094\" target=\"b74d9193-26b0-4b98-a1dc-e55e17c8a0e4\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Process and Add Routes to Main App - routing.py:L1348-1383\" value=\"Process and Add Routes to Main App - routing.py:L1348-1383\" id=\"02519ecd-f449-46a3-8430-6cf6760a4263\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"199.99999999999994\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: FastAPI Raises RequestValidationError - routing.py:L426-429\" value=\"Flow 2: FastAPI Raises RequestValidationError - routing.py:L426-429\" id=\"a3ba77cb-c744-499b-96cc-aac2b755d957\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"bc147214-42a2-42c3-a92c-ed7b8996b912\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"330.00000000000006\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"dependencies\" value=\"dependencies\" id=\"0815c268-f8f0-4bad-b217-7340208c9b09\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=34;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"2435\" y=\"2972.395627651646\" width=\"1070\" height=\"890\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"utils.py\" value=\"utils.py\" id=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=28;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"0815c268-f8f0-4bad-b217-7340208c9b09\" vertex=\"1\">\n <mxGeometry x=\"175\" y=\"70\" width=\"720\" height=\"750\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Request Validation: Validate and Deserialize JSON Body - utils.py:L912-914\" value=\"Request Validation: Validate and Deserialize JSON Body - utils.py:L912-914\" id=\"420c7ee9-0289-4e93-b419-d262eb649d89\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"590\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Checking for an Override - utils.py:L607-610\" value=\"Checking for an Override - utils.py:L607-610\" id=\"90cec20b-7186-481b-9fc1-827b0f9b4c3d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Executing the Override Dependency - utils.py:L625-634\" value=\"Executing the Override Dependency - utils.py:L625-634\" id=\"1dcbd706-7009-42e5-81ad-8e2fea59e6a5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" vertex=\"1\">\n <mxGeometry x=\"470\" y=\"208.62721272187324\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"a53196c6-51c7-4ad4-853c-6dddb4c94ed3\" value=\"Switching to
Override Callable\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" source=\"90cec20b-7186-481b-9fc1-827b0f9b4c3d\" target=\"1dcbd706-7009-42e5-81ad-8e2fea59e6a5\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"370\" y=\"245\" />\n <mxPoint x=\"370\" y=\"253.62721272187324\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Analyze Endpoint Signature and Create Dependant - utils.py:L273-578\" value=\"Analyze Endpoint Signature and Create Dependant - utils.py:L273-578\" id=\"760ebe9f-b9e2-407a-ab19-aae6b8b0c27c\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Validate and Convert Parameters - utils.py:L581-712\" value=\"Validate and Convert Parameters - utils.py:L581-712\" id=\"5512bc30-2be8-49c0-9f1a-b4df70f28286\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"330\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Execute Override Function - utils.py:L609-618\" value=\"Execute Override Function - utils.py:L609-618\" id=\"9e49809a-f9f0-44b7-af22-ccc5f43b02c7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e2b03226-2d96-4294-9d12-bf891b8cfcdc\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"460\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"0eb5062e-0f9b-4eb4-b99e-3de4035a25a2\" value=\"Request Validation:
Pass Body
for Dependency
Resolution\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"e3b022ed-3b88-44a1-8ece-42671ec7f9d5\" target=\"420c7ee9-0289-4e93-b419-d262eb649d89\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1255\" y=\"2757.3956276516465\" />\n <mxPoint x=\"1255\" y=\"2743.4691027943145\" />\n <mxPoint x=\"2310\" y=\"2743.4691027943154\" />\n <mxPoint x=\"2310\" y=\"3677.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"openapi\" value=\"openapi\" id=\"5fb160b4-d5c2-4517-8bef-8ea3c4c54a63\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"885\" y=\"545.9091993344815\" width=\"590\" height=\"889.9964438934858\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"docs.py\" value=\"docs.py\" id=\"6b3b638b-dd28-4c47-a018-8f3d70052485\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"5fb160b4-d5c2-4517-8bef-8ea3c4c54a63\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"199.99644389348578\" width=\"400\" height=\"620\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Swagger Docs Flow: Generate Swagger UI HTML Page - docs.py:L42-159\" value=\"Swagger Docs Flow: Generate Swagger UI HTML Page - docs.py:L42-159\" id=\"b71f1299-bb58-4dbf-af94-bfaf6109a6b6\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"6b3b638b-dd28-4c47-a018-8f3d70052485\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"199.99999999999997\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Swagger Docs Flow: Render Interactive UI - docs.py:L132-136\" value=\"Swagger Docs Flow: Render Interactive UI - docs.py:L132-136\" id=\"29279a4a-6028-4d0a-8e6e-5df871526243\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"6b3b638b-dd28-4c47-a018-8f3d70052485\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"69.99999999999999\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"ReDoc Flow: Generate ReDoc HTML Page - docs.py:L161-254\" value=\"ReDoc Flow: Generate ReDoc HTML Page - docs.py:L161-254\" id=\"2709025c-1969-4906-a148-18d287b5aac5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"6b3b638b-dd28-4c47-a018-8f3d70052485\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"460\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"ReDoc Flow: Render Static Documentation - docs.py:L249-250\" value=\"ReDoc Flow: Render Static Documentation - docs.py:L249-250\" id=\"c06cc146-1404-4651-9d20-e9bdb7a4cd50\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"6b3b638b-dd28-4c47-a018-8f3d70052485\" vertex=\"1\">\n <mxGeometry x=\"150\" y=\"329.99999999999994\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"utils.py\" value=\"utils.py\" id=\"da7e014f-3756-404b-8a5f-bca25d199862\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=16;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"5fb160b4-d5c2-4517-8bef-8ea3c4c54a63\" vertex=\"1\">\n <mxGeometry x=\"205\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"c09eca71-295a-433a-ab27-2870cb096176\" value=\"Swagger Docs
Flow: Call
HTML Generation
Utility\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=17;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"e4a59297-1264-44a9-898c-4dee94711ce9\" target=\"b71f1299-bb58-4dbf-af94-bfaf6109a6b6\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"779.9999999999999\" y=\"792.8880878045438\" />\n <mxPoint x=\"779.9999999999999\" y=\"990.9056432279672\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"8c03ffed-641c-4edb-86fd-8373f4400b75\" value=\"Swagger Docs
Flow: Browser
Receives HTML
and Requests
Schema\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"b71f1299-bb58-4dbf-af94-bfaf6109a6b6\" target=\"40a4dbed-c500-4e10-8576-a6a3c6e89f42\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2310\" y=\"990.9056432279674\" />\n <mxPoint x=\"2310\" y=\"367.88808780454394\" />\n <mxPoint x=\"120\" y=\"367.88808780454394\" />\n <mxPoint x=\"120\" y=\"662.888087804544\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89\" value=\"Shared Flow:
Transmit Generated
Schema\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=18;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"40a4dbed-c500-4e10-8576-a6a3c6e89f42\" target=\"29279a4a-6028-4d0a-8e6e-5df871526243\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"789.9999999999999\" y=\"662.8880878045438\" />\n <mxPoint x=\"789.9999999999999\" y=\"861.4819230792002\" />\n <mxPoint x=\"1090\" y=\"861.4819230791996\" />\n <mxPoint x=\"1090\" y=\"860.9056432279666\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"d645b274-e798-4677-8ecd-0cfb23b2989c\" value=\"ReDoc Flow:
Call HTML
Generation Utility\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=16;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"b7f04727-ddee-4e7f-aa93-9b248246cb43\" target=\"2709025c-1969-4906-a148-18d287b5aac5\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"759.9999999999999\" y=\"1052.8880878045438\" />\n <mxPoint x=\"759.9999999999999\" y=\"1250.9056432279672\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"d145150d-7f0b-4c3e-a048-b16f23cb5c9b\" value=\"ReDoc Flow:
Browser Receives
HTML and
Requests Schema\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"2709025c-1969-4906-a148-18d287b5aac5\" target=\"a0ec126e-9261-47be-8bfd-46fe40ae350d\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2320\" y=\"1250.9056432279674\" />\n <mxPoint x=\"2320\" y=\"317.88808780454406\" />\n <mxPoint x=\"110\" y=\"317.88808780454406\" />\n <mxPoint x=\"110\" y=\"922.888087804544\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"ee6a230a-6885-436e-9530-d36c032b611b\" value=\"Shared Flow:
Transmit Generated
Schema\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=16;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"a0ec126e-9261-47be-8bfd-46fe40ae350d\" target=\"c06cc146-1404-4651-9d20-e9bdb7a4cd50\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"769.9999999999999\" y=\"922.8880878045438\" />\n <mxPoint x=\"769.9999999999999\" y=\"1120.9056432279672\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"6f79803c-d6f1-4835-840a-8a90f70c549a\" value=\"Router Initialization\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"f6bb6d10-45ca-4e81-871f-780dea9a7305\" target=\"ffe256a7-70ab-40e0-b789-c9b6baaae7c3\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"799.9999999999999\" y=\"1442.8880878045438\" />\n <mxPoint x=\"799.9999999999999\" y=\"2107.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"12b15e5e-0779-4c86-8f9b-ea73346f85ac\" value=\"Passing Overrides
to `solve_dependencies`\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"7311e683-4633-41fe-94d6-cd7f59f20fc0\" target=\"90cec20b-7186-481b-9fc1-827b0f9b4c3d\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1255\" y=\"2367.3956276516465\" />\n <mxPoint x=\"1255\" y=\"2365.575165670406\" />\n <mxPoint x=\"2350\" y=\"2365.575165670407\" />\n <mxPoint x=\"2350\" y=\"3287.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"997a4aa0-bbe7-4174-a011-df2b48d6dc0e\" value=\"Returning Resolved
Override Value\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"1dcbd706-7009-42e5-81ad-8e2fea59e6a5\" target=\"149c1867-ad1b-4774-97a5-51df12cae15c\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3580\" y=\"3296.0228403735196\" />\n <mxPoint x=\"3580\" y=\"1552.3956276516467\" />\n <mxPoint x=\"820\" y=\"1552.3956276516467\" />\n <mxPoint x=\"820\" y=\"1717.6052875897574\" />\n <mxPoint x=\"995\" y=\"1717.6052875897572\" />\n <mxPoint x=\"995\" y=\"1717.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"security\" value=\"security\" id=\"ea25c76d-337b-42df-85bd-c54190cafacf\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"185\" y=\"3279.0710646652215\" width=\"510\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"oauth2.py\" value=\"oauth2.py\" id=\"5c44eca9-f066-4266-b3c7-188264b65d9e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"ea25c76d-337b-42df-85bd-c54190cafacf\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Authentication: Extract Token from Request - oauth2.py:L381-382\" value=\"Authentication: Extract Token from Request - oauth2.py:L381-382\" id=\"ff6b2c18-8425-40a6-b27e-a2a860a6448d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"5c44eca9-f066-4266-b3c7-188264b65d9e\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"c85c9776-5f78-48a8-af8b-764a29b604fc\" value=\"HTTP Request
Received\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"760ebe9f-b9e2-407a-ab19-aae6b8b0c27c\" target=\"1528bb9f-0a02-44f7-8fb9-f12c89cff357\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2980\" y=\"3157.395627651646\" />\n <mxPoint x=\"2980\" y=\"3173.210497427239\" />\n <mxPoint x=\"3395\" y=\"3173.2104974272393\" />\n <mxPoint x=\"3395\" y=\"3174.0707161728806\" />\n <mxPoint x=\"3570\" y=\"3174.0707161728806\" />\n <mxPoint x=\"3570\" y=\"2922.3956276516465\" />\n <mxPoint x=\"820\" y=\"2922.3956276516465\" />\n <mxPoint x=\"820\" y=\"2497.395627651647\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"c178ca0c-2977-4fc1-bba5-9daf176b094e\" value=\"Pass Raw
Data for
Validation\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"1528bb9f-0a02-44f7-8fb9-f12c89cff357\" target=\"5512bc30-2be8-49c0-9f1a-b4df70f28286\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1255\" y=\"2497.3956276516465\" />\n <mxPoint x=\"1255\" y=\"2492.3556283340704\" />\n <mxPoint x=\"2330\" y=\"2492.355628334071\" />\n <mxPoint x=\"2330\" y=\"3417.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"3645da23-6b02-4826-989e-51ba79139b97\" value=\"4. Request
Passed to
Router\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"723adc58-e008-43e8-a4a5-f27f1e5b9b72\" target=\"4d253d9a-189a-4b27-bb06-5862fbba7283\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"789.9999999999999\" y=\"1572.8880878045438\" />\n <mxPoint x=\"789.9999999999999\" y=\"2237.3956276516456\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"testclient.py\" value=\"testclient.py\" id=\"06f4c382-b166-4cc9-a342-b407504d35d8\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=16;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"350\" y=\"2398.018965611556\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"exception_handlers.py\" value=\"exception_handlers.py\" id=\"a5da997e-779f-443c-817f-711373a86660\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" vertex=\"1\">\n <mxGeometry x=\"2810\" y=\"1064.7037064904966\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Default Handler Creates JSON Response - exception_handlers.py:L10-16\" value=\"Flow 1: Default Handler Creates JSON Response - exception_handlers.py:L10-16\" id=\"326d1002-39bf-4422-8057-7ba0a4bdd024\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"a5da997e-779f-443c-817f-711373a86660\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: Default Validation Handler Creates Response - exception_handlers.py:L19-25\" value=\"Flow 2: Default Validation Handler Creates Response - exception_handlers.py:L19-25\" id=\"89c7b37c-31a9-4b7c-8152-a69518ca096e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"a5da997e-779f-443c-817f-711373a86660\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"fc2d073c-7206-4740-9d83-f258184c8226\" value=\"Flow 1:
Data Passed
to Handler\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"dc65b6d2-aebe-4270-a674-6ac2fb83c227\" target=\"326d1002-39bf-4422-8057-7ba0a4bdd024\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"809.9999999999999\" y=\"1312.8880878045438\" />\n <mxPoint x=\"809.9999999999999\" y=\"1501.395627651646\" />\n <mxPoint x=\"2340\" y=\"1501.395627651646\" />\n <mxPoint x=\"2340\" y=\"1179.7037064904964\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"41851979-7fc5-43e6-a100-0ee9357cb22a\" value=\"Flow 2:
Exception Caught
by Middleware\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"e3327eea-4b00-4760-81fc-439223e65b7b\" source=\"a3ba77cb-c744-499b-96cc-aac2b755d957\" target=\"89c7b37c-31a9-4b7c-8152-a69518ca096e\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1255\" y=\"1977.3956276516462\" />\n <mxPoint x=\"1255\" y=\"1985.2044683683496\" />\n <mxPoint x=\"2350\" y=\"1985.2044683683503\" />\n <mxPoint x=\"2350\" y=\"1309.703706490497\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"dd216165-e20a-4b31-93da-09fce6984f69\" value=\"Decorator Execution\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"2b5e7ff6-1868-48b8-9702-5e22aafa2516\" target=\"6e05ecc7-7adb-4cc0-907f-c9cd89754215\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3605\" y=\"1525.3046009838843\" />\n <mxPoint x=\"3605\" y=\"1532.9039164854007\" />\n <mxPoint x=\"3800\" y=\"1532.903916485401\" />\n <mxPoint x=\"3800\" y=\"1653.1257010243942\" />\n <mxPoint x=\"4241.428571428572\" y=\"1653.125701024395\" />\n <mxPoint x=\"4241.428571428572\" y=\"1652.8880878045438\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"e898f902-e975-496a-838f-6754c642f66b\" value=\"Flow 2:
Transition to
Modular Approach\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"6e05ecc7-7adb-4cc0-907f-c9cd89754215\" target=\"926aa4a2-9860-4054-a8d3-58d1bad36a26\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"4501.428571428572\" y=\"1652.8880878045438\" />\n <mxPoint x=\"4501.428571428572\" y=\"1653.182697922587\" />\n <mxPoint x=\"4685\" y=\"1653.182697922587\" />\n <mxPoint x=\"4685\" y=\"1190\" />\n <mxPoint x=\"7690\" y=\"1190.0000000000007\" />\n <mxPoint x=\"7690\" y=\"1070.0000000000007\" />\n <mxPoint x=\"130\" y=\"1070.0000000000007\" />\n <mxPoint x=\"130\" y=\"1713.743273358051\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"1927fc0e-1179-4fce-a035-5aea887fce02\" value=\"Pass Router
to Main
App\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"926aa4a2-9860-4054-a8d3-58d1bad36a26\" target=\"a4a492b6-cd0a-4b76-a068-6332c88f2780\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"960\" y=\"1713.74327335805\" />\n <mxPoint x=\"960\" y=\"1691.0768812972528\" />\n <mxPoint x=\"1565\" y=\"1691.0768812972528\" />\n <mxPoint x=\"1565\" y=\"1712.5697010720926\" />\n <mxPoint x=\"2585\" y=\"1712.5697010720921\" />\n <mxPoint x=\"2585\" y=\"1767.9039163710968\" />\n <mxPoint x=\"3830\" y=\"1767.9039163710968\" />\n <mxPoint x=\"3830\" y=\"2167.623627128991\" />\n <mxPoint x=\"4035\" y=\"2167.623627128991\" />\n <mxPoint x=\"4035\" y=\"2302.888087804544\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"ae365bbc-07ba-4f1e-8f09-c7aff7137d26\" value=\"Request Validation:
Link Model
to Endpoint
Parameter\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"4bb82a78-f30e-4b1c-a69e-164917cfc206\" target=\"e3b022ed-3b88-44a1-8ece-42671ec7f9d5\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3605\" y=\"3890.2187052954623\" />\n <mxPoint x=\"3605\" y=\"3977.3652553021147\" />\n <mxPoint x=\"3820\" y=\"3977.3652553021143\" />\n <mxPoint x=\"3820\" y=\"3453.4757234885305\" />\n <mxPoint x=\"4685\" y=\"3453.4757234885315\" />\n <mxPoint x=\"4685\" y=\"3877.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"0ff0716f-03dd-4960-ab7c-76b74559d1f3\" value=\"Request Validation:
Inject Model
Instance into
Endpoint\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"420c7ee9-0289-4e93-b419-d262eb649d89\" target=\"d6492e72-b011-4de7-8256-7267f17c1ca3\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"6905\" y=\"4797.395627651646\" />\n <mxPoint x=\"6905\" y=\"4778.264969912275\" />\n <mxPoint x=\"7690\" y=\"4778.264969912275\" />\n <mxPoint x=\"7690\" y=\"5563.3956276516465\" />\n <mxPoint x=\"110\" y=\"5563.3956276516465\" />\n <mxPoint x=\"110\" y=\"3465.1328159000786\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"284b60e3-6fbd-4780-b433-8fc0fe8c7e28\" value=\"Response Serialization:
Pass Return
Value for
Serialization\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"bd740fd1-a54f-4634-81fc-78b0ed1642ad\" target=\"4d193d20-5a44-4123-894a-3ee686cdc355\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3625\" y=\"3465.9117177663907\" />\n <mxPoint x=\"3625\" y=\"3967.3652553021143\" />\n <mxPoint x=\"3810\" y=\"3967.3652553021143\" />\n <mxPoint x=\"3810\" y=\"3195.019978457661\" />\n <mxPoint x=\"4695\" y=\"3195.019978457661\" />\n <mxPoint x=\"4695\" y=\"3747.3956276516456\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"b6ef964f-2f6b-4548-96a8-c41ea9119862\" value=\"Dependency Information
Propagation\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"ffe256a7-70ab-40e0-b789-c9b6baaae7c3\" target=\"e72088ee-22e5-4463-b5ff-1eaafe569f93\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"5180\" y=\"3227.3956276516456\" />\n <mxPoint x=\"5180\" y=\"3229.330785863395\" />\n <mxPoint x=\"6285\" y=\"3229.3307858633957\" />\n <mxPoint x=\"6285\" y=\"2594.703706490497\" />\n <mxPoint x=\"7495\" y=\"2594.703706490497\" />\n <mxPoint x=\"7495\" y=\"2369.718569759625\" />\n <mxPoint x=\"7720\" y=\"2369.7185697596246\" />\n <mxPoint x=\"7720\" y=\"920\" />\n <mxPoint x=\"100\" y=\"920\" />\n <mxPoint x=\"100\" y=\"4249.95248297686\" />\n <mxPoint x=\"2585\" y=\"4249.952482976859\" />\n <mxPoint x=\"2585\" y=\"4369.614933769593\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"382e0121-cd55-4d6e-be07-8107e3074955\" value=\"Request to
Route Handler\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"e72088ee-22e5-4463-b5ff-1eaafe569f93\" target=\"7311e683-4633-41fe-94d6-cd7f59f20fc0\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3095\" y=\"4369.614933769594\" />\n <mxPoint x=\"3095\" y=\"4386.440525728083\" />\n <mxPoint x=\"3615\" y=\"4386.440525728082\" />\n <mxPoint x=\"3615\" y=\"3957.3652553021143\" />\n <mxPoint x=\"3800\" y=\"3957.3652553021147\" />\n <mxPoint x=\"3800\" y=\"3097.3642389472807\" />\n <mxPoint x=\"4705\" y=\"3097.3642389472807\" />\n <mxPoint x=\"4705\" y=\"3487.395627651646\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"5ba138ab-65ed-4518-bad2-c6547536ee42\" value=\"API Call:
Client Sends
Authenticated Request\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"0d3536ce-f083-416f-9777-ab87be3805ba\" target=\"ff6b2c18-8425-40a6-b27e-a2a860a6448d\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3605\" y=\"5100.96787262559\" />\n <mxPoint x=\"3605\" y=\"4748.4654930854\" />\n <mxPoint x=\"3800\" y=\"4748.465493085401\" />\n <mxPoint x=\"3800\" y=\"4584.071064665222\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"93bdc64f-4b39-440b-a6f2-ab491f9ef575\" value=\"Data Flow:
Pass Token
to User
Dependency\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"ff6b2c18-8425-40a6-b27e-a2a860a6448d\" target=\"8f262716-e919-4f69-9c85-095021269fa5\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"4685\" y=\"4584.071064665222\" />\n <mxPoint x=\"4685\" y=\"5032.3956276516465\" />\n <mxPoint x=\"7495\" y=\"5032.3956276516465\" />\n <mxPoint x=\"7495\" y=\"4763.119550606767\" />\n <mxPoint x=\"7700\" y=\"4763.119550606766\" />\n <mxPoint x=\"7700\" y=\"5613.3956276516465\" />\n <mxPoint x=\"130\" y=\"5613.3956276516465\" />\n <mxPoint x=\"130\" y=\"4971.812384984096\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"f7377c05-48b6-4245-b09b-30e0abea3484\" value=\"Register Path
Operation with
Router\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"3272394c-4b6b-4e76-872d-d6916dc99c37\" target=\"760ebe9f-b9e2-407a-ab19-aae6b8b0c27c\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2585\" y=\"4014.952482976859\" />\n <mxPoint x=\"2585\" y=\"4131.459263891344\" />\n <mxPoint x=\"3830\" y=\"4131.4592638913455\" />\n <mxPoint x=\"3830\" y=\"3955.7497523546403\" />\n <mxPoint x=\"4035\" y=\"3955.749752354641\" />\n <mxPoint x=\"4035\" y=\"4092.395627651646\" />\n <mxPoint x=\"6265\" y=\"4092.395627651646\" />\n <mxPoint x=\"6265\" y=\"4278.257444835301\" />\n <mxPoint x=\"6470\" y=\"4278.257444835302\" />\n <mxPoint x=\"6470\" y=\"4277.577218718989\" />\n <mxPoint x=\"6645\" y=\"4277.577218718989\" />\n <mxPoint x=\"6645\" y=\"4277.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4\" value=\"Pass Validated
Arguments to
Endpoint Function\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"5512bc30-2be8-49c0-9f1a-b4df70f28286\" target=\"53058048-3874-442b-a561-6a04804417d7\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"6905\" y=\"4537.395627651646\" />\n <mxPoint x=\"6905\" y=\"4538.762601399716\" />\n <mxPoint x=\"7515\" y=\"4538.762601399716\" />\n <mxPoint x=\"7515\" y=\"4401.824397831204\" />\n <mxPoint x=\"7740\" y=\"4401.824397831205\" />\n <mxPoint x=\"7740\" y=\"819.9999999999995\" />\n <mxPoint x=\"80\" y=\"819.9999999999995\" />\n <mxPoint x=\"80\" y=\"3884.7172173128592\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"d4810b21-a037-499b-bf29-64229b7fb89d\" value=\"2. Application
Initialization and
Route Registration\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"6d538c95-7002-4e13-a58e-42276e93a916\" target=\"723adc58-e008-43e8-a4a5-f27f1e5b9b72\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3810\" y=\"2221.0266028340197\" />\n <mxPoint x=\"3810\" y=\"2692.8880878045434\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"docs\" value=\"docs\" id=\"0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=28;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" parent=\"1\" vertex=\"1\">\n <mxGeometry x=\"1595\" y=\"120\" width=\"740\" height=\"650\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"en\" value=\"en\" id=\"eeba5834-dc44-4983-ac8f-809375127cc9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"600\" height=\"510\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"docs\" value=\"docs\" id=\"c4536ff7-38c9-4678-8471-cc92f8c3d93f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" parent=\"eeba5834-dc44-4983-ac8f-809375127cc9\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"460\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"advanced\" value=\"advanced\" id=\"56e59fec-d559-4ecf-aa7b-24f48977311a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=22;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" parent=\"c4536ff7-38c9-4678-8471-cc92f8c3d93f\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"testing-dependencies.md\" value=\"testing-dependencies.md\" id=\"824784b9-9c78-4ddc-98cc-70f65c33f4b0\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"56e59fec-d559-4ecf-aa7b-24f48977311a\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"tests\" value=\"tests\" id=\"2de61716-262e-4677-b295-06e651ae2cdd\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=25;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" parent=\"1\" vertex=\"1\">\n <mxGeometry x=\"3925\" y=\"5143.3956276516465\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"test_dependency_overrides.py\" value=\"test_dependency_overrides.py\" id=\"71140f40-8323-49de-9210-f33c358fa2ef\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=17;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" parent=\"2de61716-262e-4677-b295-06e651ae2cdd\" vertex=\"1\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Clear Dependency Overrides - test_dependency_overrides.py:L275\" value=\"Clear Dependency Overrides - test_dependency_overrides.py:L275\" id=\"5ff2344e-a0ef-4568-8efc-3e9007a015f9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" parent=\"71140f40-8323-49de-9210-f33c358fa2ef\" vertex=\"1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"b45dcb5e-18e8-46a3-95d0-7911502d6f89\" value=\"Request Triggers
Dependency Resolution\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"71af56b2-6d44-43a3-a912-2a66fa6e854c\" target=\"9e49809a-f9f0-44b7-af22-ccc5f43b02c7\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3800\" y=\"4498.408676156213\" />\n <mxPoint x=\"3800\" y=\"4238.048689407085\" />\n <mxPoint x=\"6245\" y=\"4238.0486894070855\" />\n <mxPoint x=\"6245\" y=\"4667.395627651646\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7\" value=\"Inject Mock
Data into
Endpoint\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"9e49809a-f9f0-44b7-af22-ccc5f43b02c7\" target=\"0627101a-26d2-4e87-86b0-ab6e9c5e83ad\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"6905\" y=\"4667.395627651646\" />\n <mxPoint x=\"6905\" y=\"4658.474782618205\" />\n <mxPoint x=\"7750\" y=\"4658.474782618205\" />\n <mxPoint x=\"7750\" y=\"70\" />\n <mxPoint x=\"70\" y=\"70\" />\n <mxPoint x=\"70\" y=\"4734.67490908936\" />\n <mxPoint x=\"2585\" y=\"4734.674909089359\" />\n <mxPoint x=\"2585\" y=\"4629.614933769593\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"19928fa5-ddd3-422d-8617-7f4b84e33ba7\" value=\"Prepare for
Test Teardown\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"0627101a-26d2-4e87-86b0-ab6e9c5e83ad\" target=\"5ff2344e-a0ef-4568-8efc-3e9007a015f9\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3095\" y=\"4629.614933769594\" />\n <mxPoint x=\"3095\" y=\"4610.194771883134\" />\n <mxPoint x=\"3615\" y=\"4610.1947718831325\" />\n <mxPoint x=\"3615\" y=\"4758.4654930854\" />\n <mxPoint x=\"3800\" y=\"4758.4654930854\" />\n <mxPoint x=\"3800\" y=\"5328.3956276516465\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"c3e08f7d-6ac8-4d7e-ab26-246ab6656e99\" value=\"Delegate Router
Inclusion\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"4007f37b-ba49-4437-918a-380bc8859f5a\" target=\"02519ecd-f449-46a3-8430-6cf6760a4263\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2595\" y=\"1923.1523647838394\" />\n <mxPoint x=\"2595\" y=\"2456.02660283402\" />\n <mxPoint x=\"3800\" y=\"2456.0266028340207\" />\n <mxPoint x=\"3800\" y=\"2722.204717730929\" />\n <mxPoint x=\"4035\" y=\"2722.2047177309278\" />\n <mxPoint x=\"4035\" y=\"2857.888087804543\" />\n <mxPoint x=\"4745\" y=\"2857.888087804543\" />\n <mxPoint x=\"4745\" y=\"2967.3956276516456\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"28e77bbc-acde-44e2-9e00-47f86912cb89\" value=\"Application Routes
Updated\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"02519ecd-f449-46a3-8430-6cf6760a4263\" target=\"da65836d-fde5-450b-a63f-8856ed4ef131\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"5180\" y=\"2967.3956276516456\" />\n <mxPoint x=\"5180\" y=\"2980.3266848779176\" />\n <mxPoint x=\"6255\" y=\"2980.3266848779185\" />\n <mxPoint x=\"6255\" y=\"2084.438397453275\" />\n <mxPoint x=\"7710\" y=\"2084.4383974532752\" />\n <mxPoint x=\"7710\" y=\"970\" />\n <mxPoint x=\"110\" y=\"970\" />\n <mxPoint x=\"110\" y=\"2093.1400575616076\" />\n <mxPoint x=\"1565\" y=\"2093.140057561607\" />\n <mxPoint x=\"1565\" y=\"2040.8901491070148\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"4228354c-d857-427e-a55e-eae5cc0a0406\" value=\"Flow 1:
Exception Propagation\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"cc96ff59-f849-4fc3-8c77-3c015a9af800\" target=\"dc65b6d2-aebe-4270-a674-6ac2fb83c227\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1910\" y=\"2520.8901491070146\" />\n <mxPoint x=\"1910\" y=\"2521.597021121983\" />\n <mxPoint x=\"2585\" y=\"2521.5970211219824\" />\n <mxPoint x=\"2585\" y=\"1984.933586868502\" />\n <mxPoint x=\"3820\" y=\"1984.9335868685025\" />\n <mxPoint x=\"3820\" y=\"2432.8880878045434\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"458cb68b-a494-4b53-adf8-5d96d8d30f6f\" value=\"Flow 1:
Transmit Final
HTTP Error
Response\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"326d1002-39bf-4422-8057-7ba0a4bdd024\" target=\"aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"7495\" y=\"2299.7037064904966\" />\n <mxPoint x=\"7495\" y=\"2074.438397453275\" />\n <mxPoint x=\"7700\" y=\"2074.438397453275\" />\n <mxPoint x=\"7700\" y=\"1019.9999999999995\" />\n <mxPoint x=\"120\" y=\"1019.9999999999995\" />\n <mxPoint x=\"120\" y=\"2920.8901491070146\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"e4285640-4dfa-4273-ac7a-81d5752548d0\" value=\"Flow 2:
Data Validation
Fails\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a\" target=\"a3ba77cb-c744-499b-96cc-aac2b755d957\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"1175\" y=\"2920.8901491070146\" />\n <mxPoint x=\"1175\" y=\"2928.1946638420645\" />\n <mxPoint x=\"2585\" y=\"2928.194663842064\" />\n <mxPoint x=\"2585\" y=\"2908.888087804543\" />\n <mxPoint x=\"4735\" y=\"2908.888087804544\" />\n <mxPoint x=\"4735\" y=\"3097.3956276516456\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"23811991-d36d-4f07-8537-26065c5d3a44\" value=\"Flow 2:
Transmit Final
Validation Error
Response\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" parent=\"1\" source=\"89c7b37c-31a9-4b7c-8152-a69518ca096e\" target=\"ca47235c-5df6-4452-a574-2e6e3aa67b1b\" edge=\"1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"7730\" y=\"2429.703706490496\" />\n <mxPoint x=\"7730\" y=\"869.9999999999995\" />\n <mxPoint x=\"90\" y=\"869.9999999999995\" />\n <mxPoint x=\"90\" y=\"3050.8901491070146\" />\n </Array>\n </mxGeometry>\n </mxCell>\n </root>\n </mxGraphModel>\n </diagram>\n</mxfile>\n",
|
|
"fileName": "",
|
|
"fileURL": "github",
|
|
"repoData": {
|
|
"docs": {
|
|
"path": "docs",
|
|
"fileName": "docs",
|
|
"cellName": "docs",
|
|
"cellId": "0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e",
|
|
"visible": true,
|
|
"children": [
|
|
"docs/en"
|
|
]
|
|
},
|
|
"docs/en": {
|
|
"path": "docs/en",
|
|
"fileName": "en",
|
|
"cellName": "en",
|
|
"cellId": "eeba5834-dc44-4983-ac8f-809375127cc9",
|
|
"visible": true,
|
|
"parentCellId": "0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e",
|
|
"children": [
|
|
"docs/en/docs"
|
|
]
|
|
},
|
|
"docs/en/docs": {
|
|
"path": "docs/en/docs",
|
|
"fileName": "docs",
|
|
"cellName": "docs",
|
|
"cellId": "c4536ff7-38c9-4678-8471-cc92f8c3d93f",
|
|
"visible": true,
|
|
"parentCellId": "eeba5834-dc44-4983-ac8f-809375127cc9",
|
|
"children": [
|
|
"docs/en/docs/advanced"
|
|
]
|
|
},
|
|
"docs/en/docs/advanced": {
|
|
"path": "docs/en/docs/advanced",
|
|
"fileName": "advanced",
|
|
"cellName": "advanced",
|
|
"cellId": "56e59fec-d559-4ecf-aa7b-24f48977311a",
|
|
"visible": true,
|
|
"parentCellId": "c4536ff7-38c9-4678-8471-cc92f8c3d93f",
|
|
"children": [
|
|
"docs/en/docs/advanced/testing-dependencies.md"
|
|
]
|
|
},
|
|
"docs/en/docs/advanced/testing-dependencies.md": {
|
|
"path": "docs/en/docs/advanced/testing-dependencies.md",
|
|
"fileName": "testing-dependencies.md",
|
|
"cellName": "testing-dependencies.md",
|
|
"cellId": "824784b9-9c78-4ddc-98cc-70f65c33f4b0",
|
|
"visible": true,
|
|
"parentCellId": "56e59fec-d559-4ecf-aa7b-24f48977311a"
|
|
},
|
|
"docs_src": {
|
|
"path": "docs_src",
|
|
"fileName": "docs_src",
|
|
"cellName": "docs_src",
|
|
"cellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"visible": true,
|
|
"children": [
|
|
"docs_src/first_steps",
|
|
"docs_src/bigger_applications",
|
|
"docs_src/body",
|
|
"docs_src/response_model",
|
|
"docs_src/dependency_testing",
|
|
"docs_src/security",
|
|
"docs_src/body_multiple_params",
|
|
"docs_src/async_tests",
|
|
"docs_src/app_testing",
|
|
"docs_src/handling_errors"
|
|
]
|
|
},
|
|
"docs_src/app_testing": {
|
|
"path": "docs_src/app_testing",
|
|
"fileName": "app_testing",
|
|
"cellName": "app_testing",
|
|
"cellId": "6dc9040b-9a18-4adc-9e48-8101ad662c99",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/app_testing/tutorial001.py"
|
|
]
|
|
},
|
|
"docs_src/app_testing/tutorial001.py": {
|
|
"path": "docs_src/app_testing/tutorial001.py",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"visible": true,
|
|
"parentCellId": "6dc9040b-9a18-4adc-9e48-8101ad662c99",
|
|
"children": [
|
|
"docs_src/app_testing/tutorial001.py-simstep-775603fe-da91-489f-996b-84107c8f7862",
|
|
"docs_src/app_testing/tutorial001.py-simstep-31594c7d-7192-434e-aedb-53c1584bf215",
|
|
"docs_src/app_testing/tutorial001.py-simstep-6036575c-1bb4-44d0-b975-985fd3d17016",
|
|
"docs_src/app_testing/tutorial001.py-simstep-84a2b60d-be4a-4bba-80bc-3069c0e96cb6"
|
|
]
|
|
},
|
|
"docs_src/async_tests": {
|
|
"path": "docs_src/async_tests",
|
|
"fileName": "async_tests",
|
|
"cellName": "async_tests",
|
|
"cellId": "2e0c66ab-b7e0-4b05-8614-eca7ab5cca17",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/async_tests/main.py"
|
|
]
|
|
},
|
|
"docs_src/async_tests/main.py": {
|
|
"path": "docs_src/async_tests/main.py",
|
|
"fileName": "main.py",
|
|
"cellName": "main.py",
|
|
"cellId": "aa72b614-49af-48c1-a5c3-3bc1b45981e5",
|
|
"visible": true,
|
|
"parentCellId": "2e0c66ab-b7e0-4b05-8614-eca7ab5cca17",
|
|
"children": [
|
|
"docs_src/async_tests/main.py-simstep-cda447ab-9d46-497c-a8cb-c2892e622443"
|
|
]
|
|
},
|
|
"docs_src/bigger_applications": {
|
|
"path": "docs_src/bigger_applications",
|
|
"fileName": "bigger_applications",
|
|
"cellName": "bigger_applications",
|
|
"cellId": "8b330f7a-5ce6-4249-954b-560570e6efab",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/bigger_applications/app"
|
|
]
|
|
},
|
|
"docs_src/bigger_applications/app": {
|
|
"path": "docs_src/bigger_applications/app",
|
|
"fileName": "app",
|
|
"cellName": "app",
|
|
"cellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc",
|
|
"visible": true,
|
|
"parentCellId": "8b330f7a-5ce6-4249-954b-560570e6efab",
|
|
"children": [
|
|
"docs_src/bigger_applications/app/routers",
|
|
"docs_src/bigger_applications/app/main.py"
|
|
]
|
|
},
|
|
"docs_src/bigger_applications/app/main.py": {
|
|
"path": "docs_src/bigger_applications/app/main.py",
|
|
"fileName": "main.py",
|
|
"cellName": "main.py",
|
|
"cellId": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"visible": true,
|
|
"parentCellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc",
|
|
"children": [
|
|
"docs_src/bigger_applications/app/main.py-simstep-99aeff6f-e85d-4990-8fbd-3ebab1aa05fe",
|
|
"docs_src/bigger_applications/app/main.py-simstep-cfcc3244-3cb4-40fc-9208-ebe7d0feac88",
|
|
"docs_src/bigger_applications/app/main.py-simstep-7e887cf3-4cfc-48ab-b9c7-40c2883d8138"
|
|
]
|
|
},
|
|
"docs_src/bigger_applications/app/routers": {
|
|
"path": "docs_src/bigger_applications/app/routers",
|
|
"fileName": "routers",
|
|
"cellName": "routers",
|
|
"cellId": "24b16353-49e5-4230-9464-c645c55926e0",
|
|
"visible": true,
|
|
"parentCellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc",
|
|
"children": [
|
|
"docs_src/bigger_applications/app/routers/users.py",
|
|
"docs_src/bigger_applications/app/routers/items.py"
|
|
]
|
|
},
|
|
"docs_src/bigger_applications/app/routers/items.py": {
|
|
"path": "docs_src/bigger_applications/app/routers/items.py",
|
|
"fileName": "items.py",
|
|
"cellName": "items.py",
|
|
"cellId": "b61db9f9-9cf6-428b-9da7-92da54855cd7",
|
|
"visible": true,
|
|
"parentCellId": "24b16353-49e5-4230-9464-c645c55926e0",
|
|
"children": [
|
|
"docs_src/bigger_applications/app/routers/items.py-simstep-e0b88502-55e5-4b9c-a970-9b325ed8a8e2"
|
|
]
|
|
},
|
|
"docs_src/bigger_applications/app/routers/users.py": {
|
|
"path": "docs_src/bigger_applications/app/routers/users.py",
|
|
"fileName": "users.py",
|
|
"cellName": "users.py",
|
|
"cellId": "26a92877-c137-468e-a7e8-766790d0a44c",
|
|
"visible": true,
|
|
"parentCellId": "24b16353-49e5-4230-9464-c645c55926e0",
|
|
"children": [
|
|
"docs_src/bigger_applications/app/routers/users.py-simstep-f60e1194-8deb-4b13-8401-2f7d4d59e025",
|
|
"docs_src/bigger_applications/app/routers/users.py-simstep-d50816dd-f2a3-4fa9-8fb5-ef6a35151ca6"
|
|
]
|
|
},
|
|
"docs_src/body": {
|
|
"path": "docs_src/body",
|
|
"fileName": "body",
|
|
"cellName": "body",
|
|
"cellId": "1ba21140-0832-45ce-9c42-8dceb9ee9610",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/body/tutorial001.py"
|
|
]
|
|
},
|
|
"docs_src/body/tutorial001.py": {
|
|
"path": "docs_src/body/tutorial001.py",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "cf9f8228-b360-4073-ad8a-031b4bfb5b8a",
|
|
"visible": true,
|
|
"parentCellId": "1ba21140-0832-45ce-9c42-8dceb9ee9610",
|
|
"children": [
|
|
"docs_src/body/tutorial001.py-simstep-a7da901a-4a21-4bbc-8c8c-fc3dd6062628"
|
|
]
|
|
},
|
|
"docs_src/body_multiple_params": {
|
|
"path": "docs_src/body_multiple_params",
|
|
"fileName": "body_multiple_params",
|
|
"cellName": "body_multiple_params",
|
|
"cellId": "709ed4a5-434c-4f99-b716-0545f49e52c6",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/body_multiple_params/tutorial003.py"
|
|
]
|
|
},
|
|
"docs_src/body_multiple_params/tutorial003.py": {
|
|
"path": "docs_src/body_multiple_params/tutorial003.py",
|
|
"fileName": "tutorial003.py",
|
|
"cellName": "tutorial003.py",
|
|
"cellId": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074",
|
|
"visible": true,
|
|
"parentCellId": "709ed4a5-434c-4f99-b716-0545f49e52c6",
|
|
"children": [
|
|
"docs_src/body_multiple_params/tutorial003.py-simstep-c7f20cc8-9c3a-42a6-995f-39a4280ead6e",
|
|
"docs_src/body_multiple_params/tutorial003.py-simstep-62acd131-b4d2-4f6d-9e2e-67f61f5b1b95"
|
|
]
|
|
},
|
|
"docs_src/dependency_testing": {
|
|
"path": "docs_src/dependency_testing",
|
|
"fileName": "dependency_testing",
|
|
"cellName": "dependency_testing",
|
|
"cellId": "1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/dependency_testing/tutorial001.py"
|
|
]
|
|
},
|
|
"docs_src/dependency_testing/tutorial001.py": {
|
|
"path": "docs_src/dependency_testing/tutorial001.py",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"visible": true,
|
|
"parentCellId": "1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f",
|
|
"children": [
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-76b5449b-696e-4772-842a-e175d6ecfb48",
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-c52deddc-1975-4055-873c-0f72bf2dc3cb",
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-557f6440-8ca0-4cae-922e-4c5da5dc8da9",
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-3b306a98-022e-4b79-9315-8d86042184d0"
|
|
]
|
|
},
|
|
"docs_src/first_steps": {
|
|
"path": "docs_src/first_steps",
|
|
"fileName": "first_steps",
|
|
"cellName": "first_steps",
|
|
"cellId": "155fc4f9-e909-433d-bb96-a4501896f906",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/first_steps/tutorial001.py"
|
|
]
|
|
},
|
|
"docs_src/first_steps/tutorial001.py": {
|
|
"path": "docs_src/first_steps/tutorial001.py",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "ff477659-d236-42a7-8bca-c39417c94ba3",
|
|
"visible": true,
|
|
"parentCellId": "155fc4f9-e909-433d-bb96-a4501896f906",
|
|
"children": [
|
|
"docs_src/first_steps/tutorial001.py-simstep-ff8b011f-3cc3-4fa8-b840-55265541b8ed"
|
|
]
|
|
},
|
|
"docs_src/handling_errors": {
|
|
"path": "docs_src/handling_errors",
|
|
"fileName": "handling_errors",
|
|
"cellName": "handling_errors",
|
|
"cellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/handling_errors/tutorial001.py",
|
|
"docs_src/handling_errors/tutorial004.py",
|
|
"docs_src/handling_errors/tutorial006.py"
|
|
]
|
|
},
|
|
"docs_src/handling_errors/tutorial001.py": {
|
|
"path": "docs_src/handling_errors/tutorial001.py",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "d35761a9-d525-4ba8-a82f-27021eff54c0",
|
|
"visible": true,
|
|
"parentCellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472",
|
|
"children": [
|
|
"docs_src/handling_errors/tutorial001.py-simstep-215fc83a-81b9-4126-98aa-43ceba5fd293"
|
|
]
|
|
},
|
|
"docs_src/handling_errors/tutorial004.py": {
|
|
"path": "docs_src/handling_errors/tutorial004.py",
|
|
"fileName": "tutorial004.py",
|
|
"cellName": "tutorial004.py",
|
|
"cellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"visible": true,
|
|
"parentCellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472",
|
|
"children": [
|
|
"docs_src/handling_errors/tutorial004.py-simstep-67f98fe6-fc9a-4d2a-9d93-c141e1662671",
|
|
"docs_src/handling_errors/tutorial004.py-simstep-fead7102-4576-468b-b4c4-d7f7d3d02160",
|
|
"docs_src/handling_errors/tutorial004.py-simstep-c95e0d66-70bd-4d66-a616-cfe44a6b3131",
|
|
"docs_src/handling_errors/tutorial004.py-simstep-f8ecd5a4-aee3-42bf-9e54-d44c44d550ee"
|
|
]
|
|
},
|
|
"docs_src/handling_errors/tutorial006.py": {
|
|
"path": "docs_src/handling_errors/tutorial006.py",
|
|
"fileName": "tutorial006.py",
|
|
"cellName": "tutorial006.py",
|
|
"cellId": "a01899f9-de7d-4a39-8f81-ae24c94c1008",
|
|
"visible": true,
|
|
"parentCellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472"
|
|
},
|
|
"docs_src/response_model": {
|
|
"path": "docs_src/response_model",
|
|
"fileName": "response_model",
|
|
"cellName": "response_model",
|
|
"cellId": "a107d9fc-610a-46cb-b276-e20da1ef1d7f",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/response_model/tutorial003.py"
|
|
]
|
|
},
|
|
"docs_src/response_model/tutorial003.py": {
|
|
"path": "docs_src/response_model/tutorial003.py",
|
|
"fileName": "tutorial003.py",
|
|
"cellName": "tutorial003.py",
|
|
"cellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45",
|
|
"visible": true,
|
|
"parentCellId": "a107d9fc-610a-46cb-b276-e20da1ef1d7f",
|
|
"children": [
|
|
"docs_src/response_model/tutorial003.py-simstep-21c062b5-2a70-4c9e-aa40-e5e388d8f9a2",
|
|
"docs_src/response_model/tutorial003.py-simstep-41999094-9985-422a-85cb-4be9a109d7c6"
|
|
]
|
|
},
|
|
"docs_src/security": {
|
|
"path": "docs_src/security",
|
|
"fileName": "security",
|
|
"cellName": "security",
|
|
"cellId": "18cdfb57-624d-48d1-a684-e2ea2cc4267d",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"children": [
|
|
"docs_src/security/tutorial002_an_py310.py"
|
|
]
|
|
},
|
|
"docs_src/security/tutorial002_an_py310.py": {
|
|
"path": "docs_src/security/tutorial002_an_py310.py",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"cellName": "tutorial002_an_py310.py",
|
|
"cellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"visible": true,
|
|
"parentCellId": "18cdfb57-624d-48d1-a684-e2ea2cc4267d",
|
|
"children": [
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-331ce70f-4acc-4bdb-89da-3da66c565408",
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-4d860027-f748-42b3-af9a-3e9f970b3feb",
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-6f7707ff-b3dd-40c5-9c4e-bf1effd6c651",
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-8eeb8c1a-62a8-444b-ac96-5f5e3b355d26"
|
|
]
|
|
},
|
|
"fastapi": {
|
|
"path": "fastapi",
|
|
"fileName": "fastapi",
|
|
"cellName": "fastapi",
|
|
"cellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"visible": true,
|
|
"children": [
|
|
"fastapi/applications.py",
|
|
"fastapi/routing.py",
|
|
"fastapi/dependencies",
|
|
"fastapi/openapi",
|
|
"fastapi/security",
|
|
"fastapi/testclient.py",
|
|
"fastapi/exception_handlers.py"
|
|
]
|
|
},
|
|
"fastapi/applications.py": {
|
|
"path": "fastapi/applications.py",
|
|
"fileName": "applications.py",
|
|
"cellName": "applications.py",
|
|
"cellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"children": [
|
|
"fastapi/applications.py-simstep-a8cc3103-1ef7-444f-90c8-59f602cdbfe2",
|
|
"fastapi/applications.py-simstep-f71efd59-5861-469f-960a-f56a9b57277d",
|
|
"fastapi/applications.py-simstep-62559c5d-7c59-49cb-8dc0-eaded773a2c0",
|
|
"fastapi/applications.py-simstep-3e7e3cf7-4f11-4281-9883-665713027cca",
|
|
"fastapi/applications.py-simstep-aaedfecc-bfc7-4d9e-82ca-6c437c8d572e",
|
|
"fastapi/applications.py-simstep-faadf711-1fbb-4fc3-bef7-79a08dfdb574",
|
|
"fastapi/applications.py-simstep-6a06bcaa-1a73-4541-ac3a-ea66a2e77123",
|
|
"fastapi/applications.py-simstep-af17a645-e3b8-4db6-8ade-2962b52b1ddb",
|
|
"fastapi/applications.py-simstep-b16094b3-792f-4a5b-aa82-614601c2e75c"
|
|
]
|
|
},
|
|
"fastapi/dependencies": {
|
|
"path": "fastapi/dependencies",
|
|
"fileName": "dependencies",
|
|
"cellName": "dependencies",
|
|
"cellId": "0815c268-f8f0-4bad-b217-7340208c9b09",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"children": [
|
|
"fastapi/dependencies/utils.py"
|
|
]
|
|
},
|
|
"fastapi/dependencies/utils.py": {
|
|
"path": "fastapi/dependencies/utils.py",
|
|
"fileName": "utils.py",
|
|
"cellName": "utils.py",
|
|
"cellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"visible": true,
|
|
"parentCellId": "0815c268-f8f0-4bad-b217-7340208c9b09",
|
|
"children": [
|
|
"fastapi/dependencies/utils.py-simstep-8c8d65d3-8826-4fe3-af1a-67e092c3646b",
|
|
"fastapi/dependencies/utils.py-simstep-f92f840f-e67d-4895-83e5-aea8cb53a6ad",
|
|
"fastapi/dependencies/utils.py-simstep-16e2c7a7-9f7c-49d3-be77-e2a2a4915fe6",
|
|
"fastapi/dependencies/utils.py-simstep-99ccde73-4228-43bc-ac85-bc419331ab5b",
|
|
"fastapi/dependencies/utils.py-simstep-b4eaa910-fd79-4356-82a8-0c56e90ca2cf",
|
|
"fastapi/dependencies/utils.py-simstep-62faa1e9-54f0-47a0-b0fb-edb3be742c09"
|
|
]
|
|
},
|
|
"fastapi/exception_handlers.py": {
|
|
"path": "fastapi/exception_handlers.py",
|
|
"fileName": "exception_handlers.py",
|
|
"cellName": "exception_handlers.py",
|
|
"cellId": "a5da997e-779f-443c-817f-711373a86660",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"children": [
|
|
"fastapi/exception_handlers.py-simstep-add0b602-fe90-4174-9cd5-e6b9f89a0144",
|
|
"fastapi/exception_handlers.py-simstep-38f93061-0b96-4fab-9004-8523f30d77c2"
|
|
]
|
|
},
|
|
"fastapi/openapi": {
|
|
"path": "fastapi/openapi",
|
|
"fileName": "openapi",
|
|
"cellName": "openapi",
|
|
"cellId": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"children": [
|
|
"fastapi/openapi/docs.py",
|
|
"fastapi/openapi/utils.py"
|
|
]
|
|
},
|
|
"fastapi/openapi/docs.py": {
|
|
"path": "fastapi/openapi/docs.py",
|
|
"fileName": "docs.py",
|
|
"cellName": "docs.py",
|
|
"cellId": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"visible": true,
|
|
"parentCellId": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63",
|
|
"children": [
|
|
"fastapi/openapi/docs.py-simstep-03f94017-eaa6-4187-94c1-cfa9035fad87",
|
|
"fastapi/openapi/docs.py-simstep-eceee8d4-49f5-4b41-9200-83ccec2c84e7",
|
|
"fastapi/openapi/docs.py-simstep-8aea22f4-b50d-4473-8c0c-fc36c9674074",
|
|
"fastapi/openapi/docs.py-simstep-8cc0da97-9556-453f-bebd-835b2d04164c"
|
|
]
|
|
},
|
|
"fastapi/openapi/utils.py": {
|
|
"path": "fastapi/openapi/utils.py",
|
|
"fileName": "utils.py",
|
|
"cellName": "utils.py",
|
|
"cellId": "da7e014f-3756-404b-8a5f-bca25d199862",
|
|
"visible": true,
|
|
"parentCellId": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63"
|
|
},
|
|
"fastapi/routing.py": {
|
|
"path": "fastapi/routing.py",
|
|
"fileName": "routing.py",
|
|
"cellName": "routing.py",
|
|
"cellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"children": [
|
|
"fastapi/routing.py-simstep-c3e060a2-b0b5-481f-8d4f-084ff3a7793b",
|
|
"fastapi/routing.py-simstep-e717de6c-aa13-4478-9d04-b1502a58bb10",
|
|
"fastapi/routing.py-simstep-ed7142a9-d68b-4eff-882c-b64a5458d833",
|
|
"fastapi/routing.py-simstep-05d78d9d-f843-4424-a0df-4114cd1d9542",
|
|
"fastapi/routing.py-simstep-104b9697-bfcb-4d7f-b645-f3d12fe39444",
|
|
"fastapi/routing.py-simstep-de4c4a4a-b0ac-46a6-9944-b98922d68fef",
|
|
"fastapi/routing.py-simstep-cb5273ef-8960-4c8b-8195-7a6384823794",
|
|
"fastapi/routing.py-simstep-7aee408c-be01-4088-a719-d30b71bd7973",
|
|
"fastapi/routing.py-simstep-d6a1afe7-2b97-49ad-9e12-3aa5332905b9",
|
|
"fastapi/routing.py-simstep-9e3b06fe-61d2-45aa-8d83-4b604ab90f36",
|
|
"fastapi/routing.py-simstep-ddd8a50b-d021-4486-a599-9cee3495e6e8",
|
|
"fastapi/routing.py-simstep-4d9c03e8-d9ae-4e75-ad27-a5030492d468"
|
|
]
|
|
},
|
|
"fastapi/security": {
|
|
"path": "fastapi/security",
|
|
"fileName": "security",
|
|
"cellName": "security",
|
|
"cellId": "ea25c76d-337b-42df-85bd-c54190cafacf",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"children": [
|
|
"fastapi/security/oauth2.py"
|
|
]
|
|
},
|
|
"fastapi/security/oauth2.py": {
|
|
"path": "fastapi/security/oauth2.py",
|
|
"fileName": "oauth2.py",
|
|
"cellName": "oauth2.py",
|
|
"cellId": "5c44eca9-f066-4266-b3c7-188264b65d9e",
|
|
"visible": true,
|
|
"parentCellId": "ea25c76d-337b-42df-85bd-c54190cafacf",
|
|
"children": [
|
|
"fastapi/security/oauth2.py-simstep-93c669e0-5aa9-4df0-888d-a3da5e4371e3"
|
|
]
|
|
},
|
|
"fastapi/testclient.py": {
|
|
"path": "fastapi/testclient.py",
|
|
"fileName": "testclient.py",
|
|
"cellName": "testclient.py",
|
|
"cellId": "06f4c382-b166-4cc9-a342-b407504d35d8",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"tests": {
|
|
"path": "tests",
|
|
"fileName": "tests",
|
|
"cellName": "tests",
|
|
"cellId": "2de61716-262e-4677-b295-06e651ae2cdd",
|
|
"visible": true,
|
|
"children": [
|
|
"tests/test_dependency_overrides.py"
|
|
]
|
|
},
|
|
"tests/test_dependency_overrides.py": {
|
|
"path": "tests/test_dependency_overrides.py",
|
|
"fileName": "test_dependency_overrides.py",
|
|
"cellName": "test_dependency_overrides.py",
|
|
"cellId": "71140f40-8323-49de-9210-f33c358fa2ef",
|
|
"visible": true,
|
|
"parentCellId": "2de61716-262e-4677-b295-06e651ae2cdd",
|
|
"children": [
|
|
"tests/test_dependency_overrides.py-simstep-e74a56d7-7c39-4391-8202-b685d0c85ea2"
|
|
]
|
|
},
|
|
"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e": {
|
|
"path": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"fileName": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"cellName": "docs_src",
|
|
"cellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e",
|
|
"visible": true
|
|
},
|
|
"e3327eea-4b00-4760-81fc-439223e65b7b": {
|
|
"path": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"fileName": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"cellName": "fastapi",
|
|
"cellId": "e3327eea-4b00-4760-81fc-439223e65b7b",
|
|
"visible": true
|
|
},
|
|
"155fc4f9-e909-433d-bb96-a4501896f906": {
|
|
"path": "155fc4f9-e909-433d-bb96-a4501896f906",
|
|
"fileName": "155fc4f9-e909-433d-bb96-a4501896f906",
|
|
"cellName": "first_steps",
|
|
"cellId": "155fc4f9-e909-433d-bb96-a4501896f906",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"8b330f7a-5ce6-4249-954b-560570e6efab": {
|
|
"path": "8b330f7a-5ce6-4249-954b-560570e6efab",
|
|
"fileName": "8b330f7a-5ce6-4249-954b-560570e6efab",
|
|
"cellName": "bigger_applications",
|
|
"cellId": "8b330f7a-5ce6-4249-954b-560570e6efab",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"7f6f82df-82d2-40de-96d9-e51093e8ee57": {
|
|
"path": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"fileName": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"cellName": "applications.py",
|
|
"cellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"bc147214-42a2-42c3-a92c-ed7b8996b912": {
|
|
"path": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"fileName": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"cellName": "routing.py",
|
|
"cellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"ff477659-d236-42a7-8bca-c39417c94ba3": {
|
|
"path": "ff477659-d236-42a7-8bca-c39417c94ba3",
|
|
"fileName": "ff477659-d236-42a7-8bca-c39417c94ba3",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "ff477659-d236-42a7-8bca-c39417c94ba3",
|
|
"visible": true,
|
|
"parentCellId": "155fc4f9-e909-433d-bb96-a4501896f906"
|
|
},
|
|
"ced0be04-1104-44cf-9102-bd03eb76b5fc": {
|
|
"path": "ced0be04-1104-44cf-9102-bd03eb76b5fc",
|
|
"fileName": "ced0be04-1104-44cf-9102-bd03eb76b5fc",
|
|
"cellName": "app",
|
|
"cellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc",
|
|
"visible": true,
|
|
"parentCellId": "8b330f7a-5ce6-4249-954b-560570e6efab"
|
|
},
|
|
"24b16353-49e5-4230-9464-c645c55926e0": {
|
|
"path": "24b16353-49e5-4230-9464-c645c55926e0",
|
|
"fileName": "24b16353-49e5-4230-9464-c645c55926e0",
|
|
"cellName": "routers",
|
|
"cellId": "24b16353-49e5-4230-9464-c645c55926e0",
|
|
"visible": true,
|
|
"parentCellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc"
|
|
},
|
|
"8f4c6c49-0848-4c53-942f-8faa44426856": {
|
|
"path": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"fileName": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"cellName": "main.py",
|
|
"cellId": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"visible": true,
|
|
"parentCellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc"
|
|
},
|
|
"26a92877-c137-468e-a7e8-766790d0a44c": {
|
|
"path": "26a92877-c137-468e-a7e8-766790d0a44c",
|
|
"fileName": "26a92877-c137-468e-a7e8-766790d0a44c",
|
|
"cellName": "users.py",
|
|
"cellId": "26a92877-c137-468e-a7e8-766790d0a44c",
|
|
"visible": true,
|
|
"parentCellId": "24b16353-49e5-4230-9464-c645c55926e0"
|
|
},
|
|
"2b5e7ff6-1868-48b8-9702-5e22aafa2516": {
|
|
"path": "2b5e7ff6-1868-48b8-9702-5e22aafa2516",
|
|
"fileName": "2b5e7ff6-1868-48b8-9702-5e22aafa2516",
|
|
"cellName": "Flow 1: Define Endpoint on FastAPI App - tutorial001.py:L5-9",
|
|
"cellId": "2b5e7ff6-1868-48b8-9702-5e22aafa2516",
|
|
"visible": true,
|
|
"parentCellId": "ff477659-d236-42a7-8bca-c39417c94ba3"
|
|
},
|
|
"docs_src/first_steps/tutorial001.py-simstep-ff8b011f-3cc3-4fa8-b840-55265541b8ed": {
|
|
"path": "docs_src/first_steps/tutorial001.py-simstep-ff8b011f-3cc3-4fa8-b840-55265541b8ed",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "A developer creates a `FastAPI` app instance and defines an endpoint by applying a path operation decorator like `@app.get(\"/\")` directly to a Python function. This decorator associates a URL path and HTTP method with the function that will handle requests.",
|
|
"cellName": "Flow 1: Define Endpoint on FastAPI App - tutorial001.py:L5-9",
|
|
"cellId": "2b5e7ff6-1868-48b8-9702-5e22aafa2516",
|
|
"visible": true,
|
|
"startLine": 5,
|
|
"endLine": 9,
|
|
"parentCellId": "ff477659-d236-42a7-8bca-c39417c94ba3",
|
|
"parentPath": "docs_src/first_steps/tutorial001.py"
|
|
},
|
|
"6e05ecc7-7adb-4cc0-907f-c9cd89754215": {
|
|
"path": "6e05ecc7-7adb-4cc0-907f-c9cd89754215",
|
|
"fileName": "6e05ecc7-7adb-4cc0-907f-c9cd89754215",
|
|
"cellName": "Route Registration - applications.py:L1877-1885",
|
|
"cellId": "6e05ecc7-7adb-4cc0-907f-c9cd89754215",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-a8cc3103-1ef7-444f-90c8-59f602cdbfe2": {
|
|
"path": "fastapi/applications.py-simstep-a8cc3103-1ef7-444f-90c8-59f602cdbfe2",
|
|
"fileName": "applications.py",
|
|
"wiki": "The `@app.get()` method call is delegated to the app's internal `APIRouter`. The router's `get()` method returns a decorator that wraps the user's function (`root`). This decorator then calls an internal method (`add_api_route`) to create an `APIRoute` object and add it to the application's central list of routes, making the endpoint live.",
|
|
"cellName": "Route Registration - applications.py:L1877-1885",
|
|
"cellId": "6e05ecc7-7adb-4cc0-907f-c9cd89754215",
|
|
"visible": true,
|
|
"startLine": 1877,
|
|
"endLine": 1885,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"926aa4a2-9860-4054-a8d3-58d1bad36a26": {
|
|
"path": "926aa4a2-9860-4054-a8d3-58d1bad36a26",
|
|
"fileName": "926aa4a2-9860-4054-a8d3-58d1bad36a26",
|
|
"cellName": "Define Endpoints in a Router Module - users.py:L1-11",
|
|
"cellId": "926aa4a2-9860-4054-a8d3-58d1bad36a26",
|
|
"visible": true,
|
|
"parentCellId": "26a92877-c137-468e-a7e8-766790d0a44c"
|
|
},
|
|
"docs_src/bigger_applications/app/routers/users.py-simstep-f60e1194-8deb-4b13-8401-2f7d4d59e025": {
|
|
"path": "docs_src/bigger_applications/app/routers/users.py-simstep-f60e1194-8deb-4b13-8401-2f7d4d59e025",
|
|
"fileName": "users.py",
|
|
"wiki": "A developer creates an `APIRouter` instance in a separate module (e.g., `app/routers/users.py`) and defines path operations on it using decorators like `@router.get()`. This encapsulates all user-related endpoints in one place.",
|
|
"cellName": "Define Endpoints in a Router Module - users.py:L1-11",
|
|
"cellId": "926aa4a2-9860-4054-a8d3-58d1bad36a26",
|
|
"visible": true,
|
|
"startLine": 1,
|
|
"endLine": 11,
|
|
"parentCellId": "26a92877-c137-468e-a7e8-766790d0a44c",
|
|
"parentPath": "docs_src/bigger_applications/app/routers/users.py"
|
|
},
|
|
"a4a492b6-cd0a-4b76-a068-6332c88f2780": {
|
|
"path": "a4a492b6-cd0a-4b76-a068-6332c88f2780",
|
|
"fileName": "a4a492b6-cd0a-4b76-a068-6332c88f2780",
|
|
"cellName": "Merge Router into Application - applications.py:L1505-1513",
|
|
"cellId": "a4a492b6-cd0a-4b76-a068-6332c88f2780",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-f71efd59-5861-469f-960a-f56a9b57277d": {
|
|
"path": "fastapi/applications.py-simstep-f71efd59-5861-469f-960a-f56a9b57277d",
|
|
"fileName": "applications.py",
|
|
"wiki": "The `app.include_router()` call triggers the `FastAPI` instance to iterate through the routes defined in the provided `APIRouter`. For each route, it creates a new `APIRoute` object, applies any specified parameters like a path prefix or tags, and adds it to the main application's central router. This makes the endpoints from the sub-router available to receive requests.",
|
|
"cellName": "Merge Router into Application - applications.py:L1505-1513",
|
|
"cellId": "a4a492b6-cd0a-4b76-a068-6332c88f2780",
|
|
"visible": true,
|
|
"startLine": 1505,
|
|
"endLine": 1513,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"dd216165-e20a-4b31-93da-09fce6984f69": {
|
|
"path": "dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"fileName": "dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"cellName": "Decorator Execution",
|
|
"cellId": "dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-5b2746fd-6e75-4f21-949e-e9ee37f16d2d-dd216165-e20a-4b31-93da-09fce6984f69": {
|
|
"path": "generated-edge-simstep-5b2746fd-6e75-4f21-949e-e9ee37f16d2d-dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Decorator Execution",
|
|
"cellId": "dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"visible": true,
|
|
"startLine": 8,
|
|
"endLine": 8,
|
|
"parentPath": "docs_src/first_steps/tutorial001.py"
|
|
},
|
|
"e898f902-e975-496a-838f-6754c642f66b": {
|
|
"path": "e898f902-e975-496a-838f-6754c642f66b",
|
|
"fileName": "e898f902-e975-496a-838f-6754c642f66b",
|
|
"cellName": "Flow 2:\nTransition to\nModular Approach",
|
|
"cellId": "e898f902-e975-496a-838f-6754c642f66b",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-d731c9cf-f665-4c13-b695-5b975262c68a-e898f902-e975-496a-838f-6754c642f66b": {
|
|
"path": "generated-edge-simstep-d731c9cf-f665-4c13-b695-5b975262c68a-e898f902-e975-496a-838f-6754c642f66b",
|
|
"fileName": "applications.py",
|
|
"cellName": "Flow 2: Transition to Modular Approach",
|
|
"cellId": "e898f902-e975-496a-838f-6754c642f66b",
|
|
"visible": true,
|
|
"startLine": 667,
|
|
"endLine": 675,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"1927fc0e-1179-4fce-a035-5aea887fce02": {
|
|
"path": "1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"fileName": "1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"cellName": "Pass Router\nto Main\nApp",
|
|
"cellId": "1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-f941cc6e-ebc5-4ebd-8b5e-fefc2ddf5f1c-1927fc0e-1179-4fce-a035-5aea887fce02": {
|
|
"path": "generated-edge-simstep-f941cc6e-ebc5-4ebd-8b5e-fefc2ddf5f1c-1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"fileName": "users.py",
|
|
"cellName": "Pass Router to Main App",
|
|
"cellId": "1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"visible": true,
|
|
"startLine": 11,
|
|
"endLine": 11,
|
|
"parentPath": "docs_src/bigger_applications/app/routers/users.py"
|
|
},
|
|
"1ba21140-0832-45ce-9c42-8dceb9ee9610": {
|
|
"path": "1ba21140-0832-45ce-9c42-8dceb9ee9610",
|
|
"fileName": "1ba21140-0832-45ce-9c42-8dceb9ee9610",
|
|
"cellName": "body",
|
|
"cellId": "1ba21140-0832-45ce-9c42-8dceb9ee9610",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"a107d9fc-610a-46cb-b276-e20da1ef1d7f": {
|
|
"path": "a107d9fc-610a-46cb-b276-e20da1ef1d7f",
|
|
"fileName": "a107d9fc-610a-46cb-b276-e20da1ef1d7f",
|
|
"cellName": "response_model",
|
|
"cellId": "a107d9fc-610a-46cb-b276-e20da1ef1d7f",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"0815c268-f8f0-4bad-b217-7340208c9b09": {
|
|
"path": "0815c268-f8f0-4bad-b217-7340208c9b09",
|
|
"fileName": "0815c268-f8f0-4bad-b217-7340208c9b09",
|
|
"cellName": "dependencies",
|
|
"cellId": "0815c268-f8f0-4bad-b217-7340208c9b09",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"cf9f8228-b360-4073-ad8a-031b4bfb5b8a": {
|
|
"path": "cf9f8228-b360-4073-ad8a-031b4bfb5b8a",
|
|
"fileName": "cf9f8228-b360-4073-ad8a-031b4bfb5b8a",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "cf9f8228-b360-4073-ad8a-031b4bfb5b8a",
|
|
"visible": true,
|
|
"parentCellId": "1ba21140-0832-45ce-9c42-8dceb9ee9610"
|
|
},
|
|
"07829d93-9e93-4a1f-8c08-721c2e82ec45": {
|
|
"path": "07829d93-9e93-4a1f-8c08-721c2e82ec45",
|
|
"fileName": "07829d93-9e93-4a1f-8c08-721c2e82ec45",
|
|
"cellName": "tutorial003.py",
|
|
"cellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45",
|
|
"visible": true,
|
|
"parentCellId": "a107d9fc-610a-46cb-b276-e20da1ef1d7f"
|
|
},
|
|
"e2b03226-2d96-4294-9d12-bf891b8cfcdc": {
|
|
"path": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"fileName": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"cellName": "utils.py",
|
|
"cellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"visible": true,
|
|
"parentCellId": "0815c268-f8f0-4bad-b217-7340208c9b09"
|
|
},
|
|
"4bb82a78-f30e-4b1c-a69e-164917cfc206": {
|
|
"path": "4bb82a78-f30e-4b1c-a69e-164917cfc206",
|
|
"fileName": "4bb82a78-f30e-4b1c-a69e-164917cfc206",
|
|
"cellName": "Request Validation: Define Pydantic Model for Request Body - tutorial001.py:L6-10",
|
|
"cellId": "4bb82a78-f30e-4b1c-a69e-164917cfc206",
|
|
"visible": true,
|
|
"parentCellId": "cf9f8228-b360-4073-ad8a-031b4bfb5b8a"
|
|
},
|
|
"docs_src/body/tutorial001.py-simstep-a7da901a-4a21-4bbc-8c8c-fc3dd6062628": {
|
|
"path": "docs_src/body/tutorial001.py-simstep-a7da901a-4a21-4bbc-8c8c-fc3dd6062628",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "A developer defines a class inheriting from Pydantic's `BaseModel`. This class specifies the expected structure, data types, and validation rules for the incoming request body. FastAPI will use this model to automatically parse and validate the request payload.",
|
|
"cellName": "Request Validation: Define Pydantic Model for Request Body - tutorial001.py:L6-10",
|
|
"cellId": "4bb82a78-f30e-4b1c-a69e-164917cfc206",
|
|
"visible": true,
|
|
"startLine": 6,
|
|
"endLine": 10,
|
|
"parentCellId": "cf9f8228-b360-4073-ad8a-031b4bfb5b8a",
|
|
"parentPath": "docs_src/body/tutorial001.py"
|
|
},
|
|
"e3b022ed-3b88-44a1-8ece-42671ec7f9d5": {
|
|
"path": "e3b022ed-3b88-44a1-8ece-42671ec7f9d5",
|
|
"fileName": "e3b022ed-3b88-44a1-8ece-42671ec7f9d5",
|
|
"cellName": "Request Validation: Receive and Read Request Body - routing.py:L328-330",
|
|
"cellId": "e3b022ed-3b88-44a1-8ece-42671ec7f9d5",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-c3e060a2-b0b5-481f-8d4f-084ff3a7793b": {
|
|
"path": "fastapi/routing.py-simstep-c3e060a2-b0b5-481f-8d4f-084ff3a7793b",
|
|
"fileName": "routing.py",
|
|
"wiki": "When a POST request is made to the endpoint, FastAPI's routing layer receives it. The framework then asynchronously reads the raw bytes from the incoming HTTP request body to prepare it for processing.",
|
|
"cellName": "Request Validation: Receive and Read Request Body - routing.py:L328-330",
|
|
"cellId": "e3b022ed-3b88-44a1-8ece-42671ec7f9d5",
|
|
"visible": true,
|
|
"startLine": 328,
|
|
"endLine": 330,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"420c7ee9-0289-4e93-b419-d262eb649d89": {
|
|
"path": "420c7ee9-0289-4e93-b419-d262eb649d89",
|
|
"fileName": "420c7ee9-0289-4e93-b419-d262eb649d89",
|
|
"cellName": "Request Validation: Validate and Deserialize JSON Body - utils.py:L912-914",
|
|
"cellId": "420c7ee9-0289-4e93-b419-d262eb649d89",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"fastapi/dependencies/utils.py-simstep-8c8d65d3-8826-4fe3-af1a-67e092c3646b": {
|
|
"path": "fastapi/dependencies/utils.py-simstep-8c8d65d3-8826-4fe3-af1a-67e092c3646b",
|
|
"fileName": "utils.py",
|
|
"wiki": "The dependency resolution logic validates the parsed JSON data against the `Item` Pydantic model. It checks for required fields, correct data types, and any other validation rules. If validation succeeds, it creates an instance of the `Item` class. If it fails, a `RequestValidationError` is raised and a 422 Unprocessable Entity response is returned.",
|
|
"cellName": "Request Validation: Validate and Deserialize JSON Body - utils.py:L912-914",
|
|
"cellId": "420c7ee9-0289-4e93-b419-d262eb649d89",
|
|
"visible": true,
|
|
"startLine": 912,
|
|
"endLine": 914,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"d6492e72-b011-4de7-8256-7267f17c1ca3": {
|
|
"path": "d6492e72-b011-4de7-8256-7267f17c1ca3",
|
|
"fileName": "d6492e72-b011-4de7-8256-7267f17c1ca3",
|
|
"cellName": "Response Serialization: Define Input and Output Models - tutorial003.py:L8-19",
|
|
"cellId": "d6492e72-b011-4de7-8256-7267f17c1ca3",
|
|
"visible": true,
|
|
"parentCellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45"
|
|
},
|
|
"docs_src/response_model/tutorial003.py-simstep-21c062b5-2a70-4c9e-aa40-e5e388d8f9a2": {
|
|
"path": "docs_src/response_model/tutorial003.py-simstep-21c062b5-2a70-4c9e-aa40-e5e388d8f9a2",
|
|
"fileName": "tutorial003.py",
|
|
"wiki": "To control the output data and filter sensitive information, a developer defines separate Pydantic models for input (`UserIn`) and output (`UserOut`). The output model (`UserOut`) deliberately omits fields that should not be sent to the client, such as a user's password.",
|
|
"cellName": "Response Serialization: Define Input and Output Models - tutorial003.py:L8-19",
|
|
"cellId": "d6492e72-b011-4de7-8256-7267f17c1ca3",
|
|
"visible": true,
|
|
"startLine": 8,
|
|
"endLine": 19,
|
|
"parentCellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45",
|
|
"parentPath": "docs_src/response_model/tutorial003.py"
|
|
},
|
|
"bd740fd1-a54f-4634-81fc-78b0ed1642ad": {
|
|
"path": "bd740fd1-a54f-4634-81fc-78b0ed1642ad",
|
|
"fileName": "bd740fd1-a54f-4634-81fc-78b0ed1642ad",
|
|
"cellName": "Response Serialization: Return Data from Endpoint - tutorial003.py:L22-23",
|
|
"cellId": "bd740fd1-a54f-4634-81fc-78b0ed1642ad",
|
|
"visible": true,
|
|
"parentCellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45"
|
|
},
|
|
"docs_src/response_model/tutorial003.py-simstep-41999094-9985-422a-85cb-4be9a109d7c6": {
|
|
"path": "docs_src/response_model/tutorial003.py-simstep-41999094-9985-422a-85cb-4be9a109d7c6",
|
|
"fileName": "tutorial003.py",
|
|
"wiki": "The endpoint function executes its logic and returns data. This data can be a dictionary or, in this case, an instance of the `UserIn` model, which includes the sensitive `password` field.",
|
|
"cellName": "Response Serialization: Return Data from Endpoint - tutorial003.py:L22-23",
|
|
"cellId": "bd740fd1-a54f-4634-81fc-78b0ed1642ad",
|
|
"visible": true,
|
|
"startLine": 22,
|
|
"endLine": 23,
|
|
"parentCellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45",
|
|
"parentPath": "docs_src/response_model/tutorial003.py"
|
|
},
|
|
"4d193d20-5a44-4123-894a-3ee686cdc355": {
|
|
"path": "4d193d20-5a44-4123-894a-3ee686cdc355",
|
|
"fileName": "4d193d20-5a44-4123-894a-3ee686cdc355",
|
|
"cellName": "Response Serialization: Serialize and Filter Response Data - routing.py:L411-417",
|
|
"cellId": "4d193d20-5a44-4123-894a-3ee686cdc355",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-e717de6c-aa13-4478-9d04-b1502a58bb10": {
|
|
"path": "fastapi/routing.py-simstep-e717de6c-aa13-4478-9d04-b1502a58bb10",
|
|
"fileName": "routing.py",
|
|
"wiki": "FastAPI uses the specified `response_model` (`UserOut`) to serialize the returned data. It creates a new dictionary containing only the fields defined in `UserOut`, effectively filtering out the `password` field. If the returned data is incompatible with the response model, a `ResponseValidationError` is raised.",
|
|
"cellName": "Response Serialization: Serialize and Filter Response Data - routing.py:L411-417",
|
|
"cellId": "4d193d20-5a44-4123-894a-3ee686cdc355",
|
|
"visible": true,
|
|
"startLine": 411,
|
|
"endLine": 417,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"ae365bbc-07ba-4f1e-8f09-c7aff7137d26": {
|
|
"path": "ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"fileName": "ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"cellName": "Request Validation:\nLink Model\nto Endpoint\nParameter",
|
|
"cellId": "ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-f105906a-ab10-4431-ba14-80cdbe971f2f-ae365bbc-07ba-4f1e-8f09-c7aff7137d26": {
|
|
"path": "generated-edge-simstep-f105906a-ab10-4431-ba14-80cdbe971f2f-ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Request Validation: Link Model to Endpoint Parameter",
|
|
"cellId": "ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"visible": true,
|
|
"startLine": 18,
|
|
"endLine": 18,
|
|
"parentPath": "docs_src/body/tutorial001.py"
|
|
},
|
|
"0eb5062e-0f9b-4eb4-b99e-3de4035a25a2": {
|
|
"path": "0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"fileName": "0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"cellName": "Request Validation:\nPass Body\nfor Dependency\nResolution",
|
|
"cellId": "0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-4f3e5158-4d71-4281-86f9-7be02c5611cf-0eb5062e-0f9b-4eb4-b99e-3de4035a25a2": {
|
|
"path": "generated-edge-simstep-4f3e5158-4d71-4281-86f9-7be02c5611cf-0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"fileName": "routing.py",
|
|
"cellName": "Request Validation: Pass Body for Dependency Resolution",
|
|
"cellId": "0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"visible": true,
|
|
"startLine": 379,
|
|
"endLine": 382,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"0ff0716f-03dd-4960-ab7c-76b74559d1f3": {
|
|
"path": "0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"fileName": "0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"cellName": "Request Validation:\nInject Model\nInstance into\nEndpoint",
|
|
"cellId": "0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-fee61414-4b47-4301-a40c-841a44e11af6-0ff0716f-03dd-4960-ab7c-76b74559d1f3": {
|
|
"path": "generated-edge-simstep-fee61414-4b47-4301-a40c-841a44e11af6-0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"fileName": "utils.py",
|
|
"cellName": "Request Validation: Inject Model Instance into Endpoint",
|
|
"cellId": "0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"visible": true,
|
|
"startLine": 395,
|
|
"endLine": 396,
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"650381df-eef9-40df-9b05-777389c18054": {
|
|
"path": "650381df-eef9-40df-9b05-777389c18054",
|
|
"fileName": "650381df-eef9-40df-9b05-777389c18054",
|
|
"cellName": "Response Serialization:\nSet `response_model`\non Decorator",
|
|
"cellId": "650381df-eef9-40df-9b05-777389c18054",
|
|
"visible": true,
|
|
"parentCellId": "07829d93-9e93-4a1f-8c08-721c2e82ec45"
|
|
},
|
|
"generated-edge-simstep-1f27ba54-996c-48d8-86d9-1decb04741c5-650381df-eef9-40df-9b05-777389c18054": {
|
|
"path": "generated-edge-simstep-1f27ba54-996c-48d8-86d9-1decb04741c5-650381df-eef9-40df-9b05-777389c18054",
|
|
"fileName": "tutorial003.py",
|
|
"cellName": "Response Serialization: Set `response_model` on Decorator",
|
|
"cellId": "650381df-eef9-40df-9b05-777389c18054",
|
|
"visible": true,
|
|
"startLine": 21,
|
|
"endLine": 21,
|
|
"parentPath": "docs_src/response_model/tutorial003.py"
|
|
},
|
|
"284b60e3-6fbd-4780-b433-8fc0fe8c7e28": {
|
|
"path": "284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"fileName": "284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"cellName": "Response Serialization:\nPass Return\nValue for\nSerialization",
|
|
"cellId": "284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-ef20d7e6-e76e-461a-8dbb-4d184eb2c685-284b60e3-6fbd-4780-b433-8fc0fe8c7e28": {
|
|
"path": "generated-edge-simstep-ef20d7e6-e76e-461a-8dbb-4d184eb2c685-284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"fileName": "tutorial003.py",
|
|
"cellName": "Response Serialization: Pass Return Value for Serialization",
|
|
"cellId": "284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"visible": true,
|
|
"startLine": 395,
|
|
"endLine": 396,
|
|
"parentPath": "docs_src/response_model/tutorial003.py"
|
|
},
|
|
"5fb160b4-d5c2-4517-8bef-8ea3c4c54a63": {
|
|
"path": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63",
|
|
"fileName": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63",
|
|
"cellName": "openapi",
|
|
"cellId": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"6b3b638b-dd28-4c47-a018-8f3d70052485": {
|
|
"path": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"fileName": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"cellName": "docs.py",
|
|
"cellId": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"visible": true,
|
|
"parentCellId": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63"
|
|
},
|
|
"da7e014f-3756-404b-8a5f-bca25d199862": {
|
|
"path": "da7e014f-3756-404b-8a5f-bca25d199862",
|
|
"fileName": "da7e014f-3756-404b-8a5f-bca25d199862",
|
|
"cellName": "utils.py",
|
|
"cellId": "da7e014f-3756-404b-8a5f-bca25d199862",
|
|
"visible": true,
|
|
"parentCellId": "5fb160b4-d5c2-4517-8bef-8ea3c4c54a63"
|
|
},
|
|
"e4a59297-1264-44a9-898c-4dee94711ce9": {
|
|
"path": "e4a59297-1264-44a9-898c-4dee94711ce9",
|
|
"fileName": "e4a59297-1264-44a9-898c-4dee94711ce9",
|
|
"cellName": "Swagger Docs Flow: Receive Request for Swagger UI - applications.py:L1094-1101",
|
|
"cellId": "e4a59297-1264-44a9-898c-4dee94711ce9",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-62559c5d-7c59-49cb-8dc0-eaded773a2c0": {
|
|
"path": "fastapi/applications.py-simstep-62559c5d-7c59-49cb-8dc0-eaded773a2c0",
|
|
"fileName": "applications.py",
|
|
"wiki": "When a FastAPI application starts, it sets up default routes for API documentation. When a user navigates to `/docs`, the corresponding route handler `swagger_ui_html` is triggered to serve the documentation page.",
|
|
"cellName": "Swagger Docs Flow: Receive Request for Swagger UI - applications.py:L1094-1101",
|
|
"cellId": "e4a59297-1264-44a9-898c-4dee94711ce9",
|
|
"visible": true,
|
|
"startLine": 1094,
|
|
"endLine": 1101,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"b71f1299-bb58-4dbf-af94-bfaf6109a6b6": {
|
|
"path": "b71f1299-bb58-4dbf-af94-bfaf6109a6b6",
|
|
"fileName": "b71f1299-bb58-4dbf-af94-bfaf6109a6b6",
|
|
"cellName": "Swagger Docs Flow: Generate Swagger UI HTML Page - docs.py:L42-159",
|
|
"cellId": "b71f1299-bb58-4dbf-af94-bfaf6109a6b6",
|
|
"visible": true,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485"
|
|
},
|
|
"fastapi/openapi/docs.py-simstep-03f94017-eaa6-4187-94c1-cfa9035fad87": {
|
|
"path": "fastapi/openapi/docs.py-simstep-03f94017-eaa6-4187-94c1-cfa9035fad87",
|
|
"fileName": "docs.py",
|
|
"wiki": "The `get_swagger_ui_html` function constructs a complete HTML document. This document includes links to Swagger UI's CSS and JavaScript assets (typically from a CDN) and contains an embedded script that initializes Swagger UI, instructing it to fetch the API schema from the `openapi_url`.",
|
|
"cellName": "Swagger Docs Flow: Generate Swagger UI HTML Page - docs.py:L42-159",
|
|
"cellId": "b71f1299-bb58-4dbf-af94-bfaf6109a6b6",
|
|
"visible": true,
|
|
"startLine": 42,
|
|
"endLine": 159,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"parentPath": "fastapi/openapi/docs.py"
|
|
},
|
|
"40a4dbed-c500-4e10-8576-a6a3c6e89f42": {
|
|
"path": "40a4dbed-c500-4e10-8576-a6a3c6e89f42",
|
|
"fileName": "40a4dbed-c500-4e10-8576-a6a3c6e89f42",
|
|
"cellName": "Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079",
|
|
"cellId": "40a4dbed-c500-4e10-8576-a6a3c6e89f42",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-3e7e3cf7-4f11-4281-9883-665713027cca": {
|
|
"path": "fastapi/applications.py-simstep-3e7e3cf7-4f11-4281-9883-665713027cca",
|
|
"fileName": "applications.py",
|
|
"wiki": "The request to `/openapi.json` is handled by the `openapi` method of the FastAPI app. If the schema is not already cached, this method calls the `get_openapi` utility to generate it by introspecting the application's routes, Pydantic models, dependencies, and other metadata.",
|
|
"cellName": "Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079",
|
|
"cellId": "40a4dbed-c500-4e10-8576-a6a3c6e89f42",
|
|
"visible": true,
|
|
"startLine": 1054,
|
|
"endLine": 1079,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"29279a4a-6028-4d0a-8e6e-5df871526243": {
|
|
"path": "29279a4a-6028-4d0a-8e6e-5df871526243",
|
|
"fileName": "29279a4a-6028-4d0a-8e6e-5df871526243",
|
|
"cellName": "Swagger Docs Flow: Render Interactive UI - docs.py:L132-136",
|
|
"cellId": "29279a4a-6028-4d0a-8e6e-5df871526243",
|
|
"visible": true,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485"
|
|
},
|
|
"fastapi/openapi/docs.py-simstep-eceee8d4-49f5-4b41-9200-83ccec2c84e7": {
|
|
"path": "fastapi/openapi/docs.py-simstep-eceee8d4-49f5-4b41-9200-83ccec2c84e7",
|
|
"fileName": "docs.py",
|
|
"wiki": "The Swagger UI JavaScript running in the browser receives the OpenAPI schema as JSON. It then parses this data to dynamically render the complete, interactive API documentation, including all endpoints, parameters, and schemas.",
|
|
"cellName": "Swagger Docs Flow: Render Interactive UI - docs.py:L132-136",
|
|
"cellId": "29279a4a-6028-4d0a-8e6e-5df871526243",
|
|
"visible": true,
|
|
"startLine": 132,
|
|
"endLine": 136,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"parentPath": "fastapi/openapi/docs.py"
|
|
},
|
|
"b7f04727-ddee-4e7f-aa93-9b248246cb43": {
|
|
"path": "b7f04727-ddee-4e7f-aa93-9b248246cb43",
|
|
"fileName": "b7f04727-ddee-4e7f-aa93-9b248246cb43",
|
|
"cellName": "ReDoc Flow: Receive Request for ReDoc UI - applications.py:L1117-1123",
|
|
"cellId": "b7f04727-ddee-4e7f-aa93-9b248246cb43",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-aaedfecc-bfc7-4d9e-82ca-6c437c8d572e": {
|
|
"path": "fastapi/applications.py-simstep-aaedfecc-bfc7-4d9e-82ca-6c437c8d572e",
|
|
"fileName": "applications.py",
|
|
"wiki": "Alternatively, a user can navigate to `/redoc`. The corresponding route handler `redoc_html`, defined during application setup, is triggered to serve the ReDoc documentation page.",
|
|
"cellName": "ReDoc Flow: Receive Request for ReDoc UI - applications.py:L1117-1123",
|
|
"cellId": "b7f04727-ddee-4e7f-aa93-9b248246cb43",
|
|
"visible": true,
|
|
"startLine": 1117,
|
|
"endLine": 1123,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"2709025c-1969-4906-a148-18d287b5aac5": {
|
|
"path": "2709025c-1969-4906-a148-18d287b5aac5",
|
|
"fileName": "2709025c-1969-4906-a148-18d287b5aac5",
|
|
"cellName": "ReDoc Flow: Generate ReDoc HTML Page - docs.py:L161-254",
|
|
"cellId": "2709025c-1969-4906-a148-18d287b5aac5",
|
|
"visible": true,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485"
|
|
},
|
|
"fastapi/openapi/docs.py-simstep-8aea22f4-b50d-4473-8c0c-fc36c9674074": {
|
|
"path": "fastapi/openapi/docs.py-simstep-8aea22f4-b50d-4473-8c0c-fc36c9674074",
|
|
"fileName": "docs.py",
|
|
"wiki": "The `get_redoc_html` function constructs a complete HTML document. This document includes a link to the ReDoc JavaScript bundle (from a CDN) and uses a `<redoc>` custom HTML tag with the `spec-url` attribute set to the `openapi_url`.",
|
|
"cellName": "ReDoc Flow: Generate ReDoc HTML Page - docs.py:L161-254",
|
|
"cellId": "2709025c-1969-4906-a148-18d287b5aac5",
|
|
"visible": true,
|
|
"startLine": 161,
|
|
"endLine": 254,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"parentPath": "fastapi/openapi/docs.py"
|
|
},
|
|
"a0ec126e-9261-47be-8bfd-46fe40ae350d": {
|
|
"path": "a0ec126e-9261-47be-8bfd-46fe40ae350d",
|
|
"fileName": "a0ec126e-9261-47be-8bfd-46fe40ae350d",
|
|
"cellName": "Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079",
|
|
"cellId": "a0ec126e-9261-47be-8bfd-46fe40ae350d",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-faadf711-1fbb-4fc3-bef7-79a08dfdb574": {
|
|
"path": "fastapi/applications.py-simstep-faadf711-1fbb-4fc3-bef7-79a08dfdb574",
|
|
"fileName": "applications.py",
|
|
"wiki": "The request to `/openapi.json` is handled by the `openapi` method of the FastAPI app. If the schema is not already cached, this method calls the `get_openapi` utility to generate it by introspecting the application's routes, Pydantic models, dependencies, and other metadata. (This step is shared with the Swagger UI flow).",
|
|
"cellName": "Shared Flow: Generate OpenAPI Schema - applications.py:L1054-1079",
|
|
"cellId": "a0ec126e-9261-47be-8bfd-46fe40ae350d",
|
|
"visible": true,
|
|
"startLine": 1054,
|
|
"endLine": 1079,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"c06cc146-1404-4651-9d20-e9bdb7a4cd50": {
|
|
"path": "c06cc146-1404-4651-9d20-e9bdb7a4cd50",
|
|
"fileName": "c06cc146-1404-4651-9d20-e9bdb7a4cd50",
|
|
"cellName": "ReDoc Flow: Render Static Documentation - docs.py:L249-250",
|
|
"cellId": "c06cc146-1404-4651-9d20-e9bdb7a4cd50",
|
|
"visible": true,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485"
|
|
},
|
|
"fastapi/openapi/docs.py-simstep-8cc0da97-9556-453f-bebd-835b2d04164c": {
|
|
"path": "fastapi/openapi/docs.py-simstep-8cc0da97-9556-453f-bebd-835b2d04164c",
|
|
"fileName": "docs.py",
|
|
"wiki": "The ReDoc JavaScript running in the browser receives the OpenAPI schema as JSON. It then parses this data to dynamically render the static, three-panel API documentation page.",
|
|
"cellName": "ReDoc Flow: Render Static Documentation - docs.py:L249-250",
|
|
"cellId": "c06cc146-1404-4651-9d20-e9bdb7a4cd50",
|
|
"visible": true,
|
|
"startLine": 249,
|
|
"endLine": 250,
|
|
"parentCellId": "6b3b638b-dd28-4c47-a018-8f3d70052485",
|
|
"parentPath": "fastapi/openapi/docs.py"
|
|
},
|
|
"c09eca71-295a-433a-ab27-2870cb096176": {
|
|
"path": "c09eca71-295a-433a-ab27-2870cb096176",
|
|
"fileName": "c09eca71-295a-433a-ab27-2870cb096176",
|
|
"cellName": "Swagger Docs\nFlow: Call\nHTML Generation\nUtility",
|
|
"cellId": "c09eca71-295a-433a-ab27-2870cb096176",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-198b9c8f-91a9-4bd8-81cd-9baf58501924-c09eca71-295a-433a-ab27-2870cb096176": {
|
|
"path": "generated-edge-simstep-198b9c8f-91a9-4bd8-81cd-9baf58501924-c09eca71-295a-433a-ab27-2870cb096176",
|
|
"fileName": "applications.py",
|
|
"cellName": "Swagger Docs Flow: Call HTML Generation Utility",
|
|
"cellId": "c09eca71-295a-433a-ab27-2870cb096176",
|
|
"visible": true,
|
|
"startLine": 1097,
|
|
"endLine": 1100,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"8c03ffed-641c-4edb-86fd-8373f4400b75": {
|
|
"path": "8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"fileName": "8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"cellName": "Swagger Docs\nFlow: Browser\nReceives HTML\nand Requests\nSchema",
|
|
"cellId": "8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-271f8b55-4ca5-45eb-bcbd-200744683192-8c03ffed-641c-4edb-86fd-8373f4400b75": {
|
|
"path": "generated-edge-simstep-271f8b55-4ca5-45eb-bcbd-200744683192-8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"fileName": "docs.py",
|
|
"cellName": "Swagger Docs Flow: Browser Receives HTML and Requests Schema",
|
|
"cellId": "8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"visible": true,
|
|
"startLine": 133,
|
|
"endLine": 133,
|
|
"parentPath": "fastapi/openapi/docs.py"
|
|
},
|
|
"8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89": {
|
|
"path": "8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"fileName": "8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"cellName": "Shared Flow:\nTransmit Generated\nSchema",
|
|
"cellId": "8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-2382096f-c702-4b0e-8e88-3388794ce7cd-8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89": {
|
|
"path": "generated-edge-simstep-2382096f-c702-4b0e-8e88-3388794ce7cd-8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"fileName": "applications.py",
|
|
"cellName": "Shared Flow: Transmit Generated Schema",
|
|
"cellId": "8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"visible": true,
|
|
"startLine": 477,
|
|
"endLine": 558,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"d645b274-e798-4677-8ecd-0cfb23b2989c": {
|
|
"path": "d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"fileName": "d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"cellName": "ReDoc Flow:\nCall HTML\nGeneration Utility",
|
|
"cellId": "d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-f949b2f6-b33e-48ff-86d9-3f1889c775a4-d645b274-e798-4677-8ecd-0cfb23b2989c": {
|
|
"path": "generated-edge-simstep-f949b2f6-b33e-48ff-86d9-3f1889c775a4-d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"fileName": "applications.py",
|
|
"cellName": "ReDoc Flow: Call HTML Generation Utility",
|
|
"cellId": "d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"visible": true,
|
|
"startLine": 1120,
|
|
"endLine": 1122,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"d145150d-7f0b-4c3e-a048-b16f23cb5c9b": {
|
|
"path": "d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"fileName": "d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"cellName": "ReDoc Flow:\nBrowser Receives\nHTML and\nRequests Schema",
|
|
"cellId": "d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-24ee0db5-8733-4165-9745-8de2709d88f5-d145150d-7f0b-4c3e-a048-b16f23cb5c9b": {
|
|
"path": "generated-edge-simstep-24ee0db5-8733-4165-9745-8de2709d88f5-d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"fileName": "docs.py",
|
|
"cellName": "ReDoc Flow: Browser Receives HTML and Requests Schema",
|
|
"cellId": "d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"visible": true,
|
|
"startLine": 249,
|
|
"endLine": 249,
|
|
"parentPath": "fastapi/openapi/docs.py"
|
|
},
|
|
"ee6a230a-6885-436e-9530-d36c032b611b": {
|
|
"path": "ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"fileName": "ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"cellName": "Shared Flow:\nTransmit Generated\nSchema",
|
|
"cellId": "ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-54e37b0b-a5bd-4888-a766-a79e7bf60135-ee6a230a-6885-436e-9530-d36c032b611b": {
|
|
"path": "generated-edge-simstep-54e37b0b-a5bd-4888-a766-a79e7bf60135-ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"fileName": "applications.py",
|
|
"cellName": "Shared Flow: Transmit Generated Schema",
|
|
"cellId": "ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"visible": true,
|
|
"startLine": 477,
|
|
"endLine": 558,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f": {
|
|
"path": "1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f",
|
|
"fileName": "1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f",
|
|
"cellName": "dependency_testing",
|
|
"cellId": "1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"2b02df7f-6022-4e24-9de1-76f9379fee9a": {
|
|
"path": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"fileName": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"visible": true,
|
|
"parentCellId": "1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f"
|
|
},
|
|
"f6bb6d10-45ca-4e81-871f-780dea9a7305": {
|
|
"path": "f6bb6d10-45ca-4e81-871f-780dea9a7305",
|
|
"fileName": "f6bb6d10-45ca-4e81-871f-780dea9a7305",
|
|
"cellName": "Application Initialization - applications.py:L945-953",
|
|
"cellId": "f6bb6d10-45ca-4e81-871f-780dea9a7305",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-6a06bcaa-1a73-4541-ac3a-ea66a2e77123": {
|
|
"path": "fastapi/applications.py-simstep-6a06bcaa-1a73-4541-ac3a-ea66a2e77123",
|
|
"fileName": "applications.py",
|
|
"wiki": "A FastAPI application is instantiated. During initialization, an empty dictionary `dependency_overrides` is created to hold any future dependency overrides. This dictionary is central to swapping out dependencies, typically for testing purposes.",
|
|
"cellName": "Application Initialization - applications.py:L945-953",
|
|
"cellId": "f6bb6d10-45ca-4e81-871f-780dea9a7305",
|
|
"visible": true,
|
|
"startLine": 945,
|
|
"endLine": 953,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"ffe256a7-70ab-40e0-b789-c9b6baaae7c3": {
|
|
"path": "ffe256a7-70ab-40e0-b789-c9b6baaae7c3",
|
|
"fileName": "ffe256a7-70ab-40e0-b789-c9b6baaae7c3",
|
|
"cellName": "Route and Dependency Analysis - routing.py:L629",
|
|
"cellId": "ffe256a7-70ab-40e0-b789-c9b6baaae7c3",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-ed7142a9-d68b-4eff-882c-b64a5458d833": {
|
|
"path": "fastapi/routing.py-simstep-ed7142a9-d68b-4eff-882c-b64a5458d833",
|
|
"fileName": "routing.py",
|
|
"wiki": "When a path operation (e.g., `@app.get('/items/')`) is added, FastAPI analyzes its signature. If a parameter uses `Depends`, the `get_dependant` utility is called to parse the endpoint, identify the dependency, and create a `Dependant` object that models its requirements.",
|
|
"cellName": "Route and Dependency Analysis - routing.py:L629",
|
|
"cellId": "ffe256a7-70ab-40e0-b789-c9b6baaae7c3",
|
|
"visible": true,
|
|
"startLine": 629,
|
|
"endLine": 629,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"e72088ee-22e5-4463-b5ff-1eaafe569f93": {
|
|
"path": "e72088ee-22e5-4463-b5ff-1eaafe569f93",
|
|
"fileName": "e72088ee-22e5-4463-b5ff-1eaafe569f93",
|
|
"cellName": "Registering a Dependency Override - tutorial001.py:L31",
|
|
"cellId": "e72088ee-22e5-4463-b5ff-1eaafe569f93",
|
|
"visible": true,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a"
|
|
},
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-76b5449b-696e-4772-842a-e175d6ecfb48": {
|
|
"path": "docs_src/dependency_testing/tutorial001.py-simstep-76b5449b-696e-4772-842a-e175d6ecfb48",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "For testing or other scenarios, a dependency can be overridden by adding an entry to the `app.dependency_overrides` dictionary. The key is the original dependency callable, and the value is the new callable that should be executed instead.",
|
|
"cellName": "Registering a Dependency Override - tutorial001.py:L31",
|
|
"cellId": "e72088ee-22e5-4463-b5ff-1eaafe569f93",
|
|
"visible": true,
|
|
"startLine": 31,
|
|
"endLine": 31,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"7311e683-4633-41fe-94d6-cd7f59f20fc0": {
|
|
"path": "7311e683-4633-41fe-94d6-cd7f59f20fc0",
|
|
"fileName": "7311e683-4633-41fe-94d6-cd7f59f20fc0",
|
|
"cellName": "Initiating Dependency Resolution - routing.py:L377-384",
|
|
"cellId": "7311e683-4633-41fe-94d6-cd7f59f20fc0",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-05d78d9d-f843-4424-a0df-4114cd1d9542": {
|
|
"path": "fastapi/routing.py-simstep-05d78d9d-f843-4424-a0df-4114cd1d9542",
|
|
"fileName": "routing.py",
|
|
"wiki": "The route handler calls `solve_dependencies`. This is the core function that orchestrates the resolution of the entire dependency graph for the request, including handling any overrides.",
|
|
"cellName": "Initiating Dependency Resolution - routing.py:L377-384",
|
|
"cellId": "7311e683-4633-41fe-94d6-cd7f59f20fc0",
|
|
"visible": true,
|
|
"startLine": 377,
|
|
"endLine": 384,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"90cec20b-7186-481b-9fc1-827b0f9b4c3d": {
|
|
"path": "90cec20b-7186-481b-9fc1-827b0f9b4c3d",
|
|
"fileName": "90cec20b-7186-481b-9fc1-827b0f9b4c3d",
|
|
"cellName": "Checking for an Override - utils.py:L607-610",
|
|
"cellId": "90cec20b-7186-481b-9fc1-827b0f9b4c3d",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"fastapi/dependencies/utils.py-simstep-f92f840f-e67d-4895-83e5-aea8cb53a6ad": {
|
|
"path": "fastapi/dependencies/utils.py-simstep-f92f840f-e67d-4895-83e5-aea8cb53a6ad",
|
|
"fileName": "utils.py",
|
|
"wiki": "Inside `solve_dependencies`, for each dependency being resolved, the system checks if the original dependency function exists as a key in the `dependency_overrides` dictionary.",
|
|
"cellName": "Checking for an Override - utils.py:L607-610",
|
|
"cellId": "90cec20b-7186-481b-9fc1-827b0f9b4c3d",
|
|
"visible": true,
|
|
"startLine": 607,
|
|
"endLine": 610,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"1dcbd706-7009-42e5-81ad-8e2fea59e6a5": {
|
|
"path": "1dcbd706-7009-42e5-81ad-8e2fea59e6a5",
|
|
"fileName": "1dcbd706-7009-42e5-81ad-8e2fea59e6a5",
|
|
"cellName": "Executing the Override Dependency - utils.py:L625-634",
|
|
"cellId": "1dcbd706-7009-42e5-81ad-8e2fea59e6a5",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"fastapi/dependencies/utils.py-simstep-16e2c7a7-9f7c-49d3-be77-e2a2a4915fe6": {
|
|
"path": "fastapi/dependencies/utils.py-simstep-16e2c7a7-9f7c-49d3-be77-e2a2a4915fe6",
|
|
"fileName": "utils.py",
|
|
"wiki": "The `solve_dependencies` function is called recursively, this time to process the new `Dependant` object created for the override function. This resolves the parameters of the override function and executes it.",
|
|
"cellName": "Executing the Override Dependency - utils.py:L625-634",
|
|
"cellId": "1dcbd706-7009-42e5-81ad-8e2fea59e6a5",
|
|
"visible": true,
|
|
"startLine": 625,
|
|
"endLine": 634,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"149c1867-ad1b-4774-97a5-51df12cae15c": {
|
|
"path": "149c1867-ad1b-4774-97a5-51df12cae15c",
|
|
"fileName": "149c1867-ad1b-4774-97a5-51df12cae15c",
|
|
"cellName": "Injecting Value into Endpoint - routing.py:L389",
|
|
"cellId": "149c1867-ad1b-4774-97a5-51df12cae15c",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-104b9697-bfcb-4d7f-b645-f3d12fe39444": {
|
|
"path": "fastapi/routing.py-simstep-104b9697-bfcb-4d7f-b645-f3d12fe39444",
|
|
"fileName": "routing.py",
|
|
"wiki": "FastAPI calls the main endpoint function (`read_items`), injecting the result from the overridden dependency as the value for the `commons` parameter.",
|
|
"cellName": "Injecting Value into Endpoint - routing.py:L389",
|
|
"cellId": "149c1867-ad1b-4774-97a5-51df12cae15c",
|
|
"visible": true,
|
|
"startLine": 389,
|
|
"endLine": 389,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"6f79803c-d6f1-4835-840a-8a90f70c549a": {
|
|
"path": "6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"fileName": "6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"cellName": "Router Initialization",
|
|
"cellId": "6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-8496aba1-ac04-49e4-8393-bbfbc6b21a3f-6f79803c-d6f1-4835-840a-8a90f70c549a": {
|
|
"path": "generated-edge-simstep-8496aba1-ac04-49e4-8393-bbfbc6b21a3f-6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"fileName": "applications.py",
|
|
"cellName": "Router Initialization",
|
|
"cellId": "6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"visible": true,
|
|
"startLine": 962,
|
|
"endLine": 969,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"b6ef964f-2f6b-4548-96a8-c41ea9119862": {
|
|
"path": "b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"fileName": "b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"cellName": "Dependency Information\nPropagation",
|
|
"cellId": "b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-648bda8a-8ce0-4133-b872-b36a5c307222-b6ef964f-2f6b-4548-96a8-c41ea9119862": {
|
|
"path": "generated-edge-simstep-648bda8a-8ce0-4133-b872-b36a5c307222-b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"fileName": "routing.py",
|
|
"cellName": "Dependency Information Propagation",
|
|
"cellId": "b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"visible": true,
|
|
"startLine": 409,
|
|
"endLine": 415,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"382e0121-cd55-4d6e-be07-8107e3074955": {
|
|
"path": "382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"fileName": "382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"cellName": "Request to\nRoute Handler",
|
|
"cellId": "382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-cdd1be57-2fde-40a2-8b73-144a7dd9fa25-382e0121-cd55-4d6e-be07-8107e3074955": {
|
|
"path": "generated-edge-simstep-cdd1be57-2fde-40a2-8b73-144a7dd9fa25-382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Request to Route Handler",
|
|
"cellId": "382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"visible": true,
|
|
"startLine": 667,
|
|
"endLine": 667,
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"12b15e5e-0779-4c86-8f9b-ea73346f85ac": {
|
|
"path": "12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"fileName": "12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"cellName": "Passing Overrides\nto `solve_dependencies`",
|
|
"cellId": "12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-f60a0dd4-d561-4be6-bc24-801785c90f57-12b15e5e-0779-4c86-8f9b-ea73346f85ac": {
|
|
"path": "generated-edge-simstep-f60a0dd4-d561-4be6-bc24-801785c90f57-12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"fileName": "routing.py",
|
|
"cellName": "Passing Overrides to `solve_dependencies`",
|
|
"cellId": "12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"visible": true,
|
|
"startLine": 380,
|
|
"endLine": 380,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"a53196c6-51c7-4ad4-853c-6dddb4c94ed3": {
|
|
"path": "a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"fileName": "a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"cellName": "Switching to\nOverride Callable",
|
|
"cellId": "a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"generated-edge-simstep-59a5196a-fa0f-4e56-9631-e5e28f624c80-a53196c6-51c7-4ad4-853c-6dddb4c94ed3": {
|
|
"path": "generated-edge-simstep-59a5196a-fa0f-4e56-9631-e5e28f624c80-a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"fileName": "utils.py",
|
|
"cellName": "Switching to Override Callable",
|
|
"cellId": "a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"visible": true,
|
|
"startLine": 611,
|
|
"endLine": 621,
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"997a4aa0-bbe7-4174-a011-df2b48d6dc0e": {
|
|
"path": "997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"fileName": "997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"cellName": "Returning Resolved\nOverride Value",
|
|
"cellId": "997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-c6e7c7e5-cc9a-4497-9c35-1d4df1a06057-997a4aa0-bbe7-4174-a011-df2b48d6dc0e": {
|
|
"path": "generated-edge-simstep-c6e7c7e5-cc9a-4497-9c35-1d4df1a06057-997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"fileName": "utils.py",
|
|
"cellName": "Returning Resolved Override Value",
|
|
"cellId": "997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"visible": true,
|
|
"startLine": 591,
|
|
"endLine": 591,
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"18cdfb57-624d-48d1-a684-e2ea2cc4267d": {
|
|
"path": "18cdfb57-624d-48d1-a684-e2ea2cc4267d",
|
|
"fileName": "18cdfb57-624d-48d1-a684-e2ea2cc4267d",
|
|
"cellName": "security",
|
|
"cellId": "18cdfb57-624d-48d1-a684-e2ea2cc4267d",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"ea25c76d-337b-42df-85bd-c54190cafacf": {
|
|
"path": "ea25c76d-337b-42df-85bd-c54190cafacf",
|
|
"fileName": "ea25c76d-337b-42df-85bd-c54190cafacf",
|
|
"cellName": "security",
|
|
"cellId": "ea25c76d-337b-42df-85bd-c54190cafacf",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"06adf03b-ecd6-4392-a5eb-c8ef4f064794": {
|
|
"path": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"fileName": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"cellName": "tutorial002_an_py310.py",
|
|
"cellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"visible": true,
|
|
"parentCellId": "18cdfb57-624d-48d1-a684-e2ea2cc4267d"
|
|
},
|
|
"5c44eca9-f066-4266-b3c7-188264b65d9e": {
|
|
"path": "5c44eca9-f066-4266-b3c7-188264b65d9e",
|
|
"fileName": "5c44eca9-f066-4266-b3c7-188264b65d9e",
|
|
"cellName": "oauth2.py",
|
|
"cellId": "5c44eca9-f066-4266-b3c7-188264b65d9e",
|
|
"visible": true,
|
|
"parentCellId": "ea25c76d-337b-42df-85bd-c54190cafacf"
|
|
},
|
|
"75f350d9-2d38-490b-a819-4ca969223fcb": {
|
|
"path": "75f350d9-2d38-490b-a819-4ca969223fcb",
|
|
"fileName": "75f350d9-2d38-490b-a819-4ca969223fcb",
|
|
"cellName": "Config: Define OAuth2 Security Scheme - tutorial002_an_py310.py:L9",
|
|
"cellId": "75f350d9-2d38-490b-a819-4ca969223fcb",
|
|
"visible": true,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794"
|
|
},
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-331ce70f-4acc-4bdb-89da-3da66c565408": {
|
|
"path": "docs_src/security/tutorial002_an_py310.py-simstep-331ce70f-4acc-4bdb-89da-3da66c565408",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"wiki": "An instance of `OAuth2PasswordBearer` is created. This object holds the configuration for the OAuth2 security scheme, including the URL where clients will send a username and password to get a token. This instance is also a 'callable' that will be used as a dependency.",
|
|
"cellName": "Config: Define OAuth2 Security Scheme - tutorial002_an_py310.py:L9",
|
|
"cellId": "75f350d9-2d38-490b-a819-4ca969223fcb",
|
|
"visible": true,
|
|
"startLine": 9,
|
|
"endLine": 9,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"0d3536ce-f083-416f-9777-ab87be3805ba": {
|
|
"path": "0d3536ce-f083-416f-9777-ab87be3805ba",
|
|
"fileName": "0d3536ce-f083-416f-9777-ab87be3805ba",
|
|
"cellName": "Config: Protect Endpoint with `get_current_user` Dependency - tutorial002_an_py310.py:L31-32",
|
|
"cellId": "0d3536ce-f083-416f-9777-ab87be3805ba",
|
|
"visible": true,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794"
|
|
},
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-4d860027-f748-42b3-af9a-3e9f970b3feb": {
|
|
"path": "docs_src/security/tutorial002_an_py310.py-simstep-4d860027-f748-42b3-af9a-3e9f970b3feb",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"wiki": "The `/users/me` endpoint is protected by adding `Depends(get_current_user)` to its signature. When a request is made to this endpoint, FastAPI will first resolve the `get_current_user` dependency before executing the endpoint's logic.",
|
|
"cellName": "Config: Protect Endpoint with `get_current_user` Dependency - tutorial002_an_py310.py:L31-32",
|
|
"cellId": "0d3536ce-f083-416f-9777-ab87be3805ba",
|
|
"visible": true,
|
|
"startLine": 31,
|
|
"endLine": 32,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"ff6b2c18-8425-40a6-b27e-a2a860a6448d": {
|
|
"path": "ff6b2c18-8425-40a6-b27e-a2a860a6448d",
|
|
"fileName": "ff6b2c18-8425-40a6-b27e-a2a860a6448d",
|
|
"cellName": "Authentication: Extract Token from Request - oauth2.py:L381-382",
|
|
"cellId": "ff6b2c18-8425-40a6-b27e-a2a860a6448d",
|
|
"visible": true,
|
|
"parentCellId": "5c44eca9-f066-4266-b3c7-188264b65d9e"
|
|
},
|
|
"fastapi/security/oauth2.py-simstep-93c669e0-5aa9-4df0-888d-a3da5e4371e3": {
|
|
"path": "fastapi/security/oauth2.py-simstep-93c669e0-5aa9-4df0-888d-a3da5e4371e3",
|
|
"fileName": "oauth2.py",
|
|
"wiki": "FastAPI's dependency injection system calls the `oauth2_scheme` dependency. This `OAuth2PasswordBearer` instance inspects the incoming request's `Authorization` header, verifies the 'Bearer' scheme, and extracts the token string. If the header is missing or malformed, it raises a 401 HTTP exception.",
|
|
"cellName": "Authentication: Extract Token from Request - oauth2.py:L381-382",
|
|
"cellId": "ff6b2c18-8425-40a6-b27e-a2a860a6448d",
|
|
"visible": true,
|
|
"startLine": 381,
|
|
"endLine": 382,
|
|
"parentCellId": "5c44eca9-f066-4266-b3c7-188264b65d9e",
|
|
"parentPath": "fastapi/security/oauth2.py"
|
|
},
|
|
"8f262716-e919-4f69-9c85-095021269fa5": {
|
|
"path": "8f262716-e919-4f69-9c85-095021269fa5",
|
|
"fileName": "8f262716-e919-4f69-9c85-095021269fa5",
|
|
"cellName": "Business Logic: Retrieve User from Token - tutorial002_an_py310.py:L26-27",
|
|
"cellId": "8f262716-e919-4f69-9c85-095021269fa5",
|
|
"visible": true,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794"
|
|
},
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-6f7707ff-b3dd-40c5-9c4e-bf1effd6c651": {
|
|
"path": "docs_src/security/tutorial002_an_py310.py-simstep-6f7707ff-b3dd-40c5-9c4e-bf1effd6c651",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"wiki": "The `get_current_user` function executes its logic. It calls a utility function (`fake_decode_token`) to convert the token string into a user object. In a real application, this step would involve decoding a JWT and/or fetching user data from a database.",
|
|
"cellName": "Business Logic: Retrieve User from Token - tutorial002_an_py310.py:L26-27",
|
|
"cellId": "8f262716-e919-4f69-9c85-095021269fa5",
|
|
"visible": true,
|
|
"startLine": 26,
|
|
"endLine": 27,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"65ee418b-cdcf-4852-b605-afa3d1f990aa": {
|
|
"path": "65ee418b-cdcf-4852-b605-afa3d1f990aa",
|
|
"fileName": "65ee418b-cdcf-4852-b605-afa3d1f990aa",
|
|
"cellName": "Business Logic: Execute Endpoint Logic - tutorial002_an_py310.py:L32",
|
|
"cellId": "65ee418b-cdcf-4852-b605-afa3d1f990aa",
|
|
"visible": true,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794"
|
|
},
|
|
"docs_src/security/tutorial002_an_py310.py-simstep-8eeb8c1a-62a8-444b-ac96-5f5e3b355d26": {
|
|
"path": "docs_src/security/tutorial002_an_py310.py-simstep-8eeb8c1a-62a8-444b-ac96-5f5e3b355d26",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"wiki": "The `read_users_me` function is executed with the resolved `current_user` dependency. It simply returns the user object, which FastAPI will then serialize into a JSON response.",
|
|
"cellName": "Business Logic: Execute Endpoint Logic - tutorial002_an_py310.py:L32",
|
|
"cellId": "65ee418b-cdcf-4852-b605-afa3d1f990aa",
|
|
"visible": true,
|
|
"startLine": 32,
|
|
"endLine": 32,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794",
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"253c3208-f450-42d2-9077-3f3ade4fcdaf": {
|
|
"path": "253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"fileName": "253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"cellName": "Dependency Injection:\nProvide Scheme\nas a\nDependency",
|
|
"cellId": "253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"visible": true,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794"
|
|
},
|
|
"generated-edge-simstep-a5f93691-63bb-4e26-8574-763af61af93b-253c3208-f450-42d2-9077-3f3ade4fcdaf": {
|
|
"path": "generated-edge-simstep-a5f93691-63bb-4e26-8574-763af61af93b-253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"cellName": "Dependency Injection: Provide Scheme as a Dependency",
|
|
"cellId": "253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"visible": true,
|
|
"startLine": 25,
|
|
"endLine": 25,
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"5ba138ab-65ed-4518-bad2-c6547536ee42": {
|
|
"path": "5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"fileName": "5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"cellName": "API Call:\nClient Sends\nAuthenticated Request",
|
|
"cellId": "5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-22c1b95d-a9fc-4082-9122-451faaef6702-5ba138ab-65ed-4518-bad2-c6547536ee42": {
|
|
"path": "generated-edge-simstep-22c1b95d-a9fc-4082-9122-451faaef6702-5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"cellName": "API Call: Client Sends Authenticated Request",
|
|
"cellId": "5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"visible": true,
|
|
"startLine": 381,
|
|
"endLine": 381,
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"93bdc64f-4b39-440b-a6f2-ab491f9ef575": {
|
|
"path": "93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"fileName": "93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"cellName": "Data Flow:\nPass Token\nto User\nDependency",
|
|
"cellId": "93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-dbbf3f0b-f780-4332-8e9c-40d49995db7e-93bdc64f-4b39-440b-a6f2-ab491f9ef575": {
|
|
"path": "generated-edge-simstep-dbbf3f0b-f780-4332-8e9c-40d49995db7e-93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"fileName": "oauth2.py",
|
|
"cellName": "Data Flow: Pass Token to User Dependency",
|
|
"cellId": "93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"visible": true,
|
|
"startLine": 25,
|
|
"endLine": 25,
|
|
"parentPath": "fastapi/security/oauth2.py"
|
|
},
|
|
"31b1cc97-11e9-49ad-a4d3-212f95564fbc": {
|
|
"path": "31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"fileName": "31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"cellName": "Dependency Injection:\nInject User\nObject into\nPath Operation",
|
|
"cellId": "31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"visible": true,
|
|
"parentCellId": "06adf03b-ecd6-4392-a5eb-c8ef4f064794"
|
|
},
|
|
"generated-edge-simstep-5f30ed11-8b51-4764-ad5d-3e7e5b41dea3-31b1cc97-11e9-49ad-a4d3-212f95564fbc": {
|
|
"path": "generated-edge-simstep-5f30ed11-8b51-4764-ad5d-3e7e5b41dea3-31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"fileName": "tutorial002_an_py310.py",
|
|
"cellName": "Dependency Injection: Inject User Object into Path Operation",
|
|
"cellId": "31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"visible": true,
|
|
"startLine": 31,
|
|
"endLine": 32,
|
|
"parentPath": "docs_src/security/tutorial002_an_py310.py"
|
|
},
|
|
"709ed4a5-434c-4f99-b716-0545f49e52c6": {
|
|
"path": "709ed4a5-434c-4f99-b716-0545f49e52c6",
|
|
"fileName": "709ed4a5-434c-4f99-b716-0545f49e52c6",
|
|
"cellName": "body_multiple_params",
|
|
"cellId": "709ed4a5-434c-4f99-b716-0545f49e52c6",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"f2ee5d12-0dd3-4bdf-a7d9-f06233086074": {
|
|
"path": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074",
|
|
"fileName": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074",
|
|
"cellName": "tutorial003.py",
|
|
"cellId": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074",
|
|
"visible": true,
|
|
"parentCellId": "709ed4a5-434c-4f99-b716-0545f49e52c6"
|
|
},
|
|
"3272394c-4b6b-4e76-872d-d6916dc99c37": {
|
|
"path": "3272394c-4b6b-4e76-872d-d6916dc99c37",
|
|
"fileName": "3272394c-4b6b-4e76-872d-d6916dc99c37",
|
|
"cellName": "Define Path Operation with Parameter Validation - tutorial003.py:L9-24",
|
|
"cellId": "3272394c-4b6b-4e76-872d-d6916dc99c37",
|
|
"visible": true,
|
|
"parentCellId": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074"
|
|
},
|
|
"docs_src/body_multiple_params/tutorial003.py-simstep-c7f20cc8-9c3a-42a6-995f-39a4280ead6e": {
|
|
"path": "docs_src/body_multiple_params/tutorial003.py-simstep-c7f20cc8-9c3a-42a6-995f-39a4280ead6e",
|
|
"fileName": "tutorial003.py",
|
|
"wiki": "A developer defines an API endpoint using a decorator like `@app.put`. Parameters for the path (`item_id`), query (`q`), and request body (`item`, `user`, `importance`) are declared with type hints. Helper functions like `Path`, `Query`, and `Body` are used to specify their source and apply validation rules (e.g., `gt=0`).",
|
|
"cellName": "Define Path Operation with Parameter Validation - tutorial003.py:L9-24",
|
|
"cellId": "3272394c-4b6b-4e76-872d-d6916dc99c37",
|
|
"visible": true,
|
|
"startLine": 9,
|
|
"endLine": 24,
|
|
"parentCellId": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074",
|
|
"parentPath": "docs_src/body_multiple_params/tutorial003.py"
|
|
},
|
|
"760ebe9f-b9e2-407a-ab19-aae6b8b0c27c": {
|
|
"path": "760ebe9f-b9e2-407a-ab19-aae6b8b0c27c",
|
|
"fileName": "760ebe9f-b9e2-407a-ab19-aae6b8b0c27c",
|
|
"cellName": "Analyze Endpoint Signature and Create Dependant - utils.py:L273-578",
|
|
"cellId": "760ebe9f-b9e2-407a-ab19-aae6b8b0c27c",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"fastapi/dependencies/utils.py-simstep-99ccde73-4228-43bc-ac85-bc419331ab5b": {
|
|
"path": "fastapi/dependencies/utils.py-simstep-99ccde73-4228-43bc-ac85-bc419331ab5b",
|
|
"fileName": "utils.py",
|
|
"wiki": "During the `APIRoute` creation, FastAPI calls `get_dependant`. This function inspects the endpoint's signature, analyzing each parameter's type and default value (`Path`, `Query`, `Body`, etc.). It creates `ModelField` objects for each parameter, capturing validation rules, and stores them in a `Dependant` object, categorized by their source (path, query, header, body).",
|
|
"cellName": "Analyze Endpoint Signature and Create Dependant - utils.py:L273-578",
|
|
"cellId": "760ebe9f-b9e2-407a-ab19-aae6b8b0c27c",
|
|
"visible": true,
|
|
"startLine": 273,
|
|
"endLine": 578,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"1528bb9f-0a02-44f7-8fb9-f12c89cff357": {
|
|
"path": "1528bb9f-0a02-44f7-8fb9-f12c89cff357",
|
|
"fileName": "1528bb9f-0a02-44f7-8fb9-f12c89cff357",
|
|
"cellName": "Extract Raw Data from Request - routing.py:L333-371",
|
|
"cellId": "1528bb9f-0a02-44f7-8fb9-f12c89cff357",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-de4c4a4a-b0ac-46a6-9944-b98922d68fef": {
|
|
"path": "fastapi/routing.py-simstep-de4c4a4a-b0ac-46a6-9944-b98922d68fef",
|
|
"fileName": "routing.py",
|
|
"wiki": "Inside the `APIRoute.handle` method, data is extracted from the raw request. Path parameters are parsed from the URL. For JSON requests, `request.json()` is awaited to parse the body. For form data, `request.form()` would be called. Query parameters and headers are also made available from the request object.",
|
|
"cellName": "Extract Raw Data from Request - routing.py:L333-371",
|
|
"cellId": "1528bb9f-0a02-44f7-8fb9-f12c89cff357",
|
|
"visible": true,
|
|
"startLine": 333,
|
|
"endLine": 371,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"5512bc30-2be8-49c0-9f1a-b4df70f28286": {
|
|
"path": "5512bc30-2be8-49c0-9f1a-b4df70f28286",
|
|
"fileName": "5512bc30-2be8-49c0-9f1a-b4df70f28286",
|
|
"cellName": "Validate and Convert Parameters - utils.py:L581-712",
|
|
"cellId": "5512bc30-2be8-49c0-9f1a-b4df70f28286",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"fastapi/dependencies/utils.py-simstep-b4eaa910-fd79-4356-82a8-0c56e90ca2cf": {
|
|
"path": "fastapi/dependencies/utils.py-simstep-b4eaa910-fd79-4356-82a8-0c56e90ca2cf",
|
|
"fileName": "utils.py",
|
|
"wiki": "The `solve_dependencies` function processes the raw parameters against the rules defined in the `Dependant` object. It uses helpers like `request_params_to_args` and `request_body_to_args` to validate the data. This includes type casting (e.g., string '42' to integer 42), applying validation rules (`gt=0`), and handling aliases. If validation fails, a `RequestValidationError` is raised.",
|
|
"cellName": "Validate and Convert Parameters - utils.py:L581-712",
|
|
"cellId": "5512bc30-2be8-49c0-9f1a-b4df70f28286",
|
|
"visible": true,
|
|
"startLine": 581,
|
|
"endLine": 712,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"53058048-3874-442b-a561-6a04804417d7": {
|
|
"path": "53058048-3874-442b-a561-6a04804417d7",
|
|
"fileName": "53058048-3874-442b-a561-6a04804417d7",
|
|
"cellName": "Execute Path Operation Function - tutorial003.py:L9-24",
|
|
"cellId": "53058048-3874-442b-a561-6a04804417d7",
|
|
"visible": true,
|
|
"parentCellId": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074"
|
|
},
|
|
"docs_src/body_multiple_params/tutorial003.py-simstep-62acd131-b4d2-4f6d-9e2e-67f61f5b1b95": {
|
|
"path": "docs_src/body_multiple_params/tutorial003.py-simstep-62acd131-b4d2-4f6d-9e2e-67f61f5b1b95",
|
|
"fileName": "tutorial003.py",
|
|
"wiki": "The user-defined path operation function is finally executed with the validated and converted data passed as arguments. The function's return value will be used to generate the final HTTP response.",
|
|
"cellName": "Execute Path Operation Function - tutorial003.py:L9-24",
|
|
"cellId": "53058048-3874-442b-a561-6a04804417d7",
|
|
"visible": true,
|
|
"startLine": 9,
|
|
"endLine": 24,
|
|
"parentCellId": "f2ee5d12-0dd3-4bdf-a7d9-f06233086074",
|
|
"parentPath": "docs_src/body_multiple_params/tutorial003.py"
|
|
},
|
|
"f7377c05-48b6-4245-b09b-30e0abea3484": {
|
|
"path": "f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"fileName": "f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"cellName": "Register Path\nOperation with\nRouter",
|
|
"cellId": "f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-a2997e81-9fc8-4f9d-adf2-7fac56a58991-f7377c05-48b6-4245-b09b-30e0abea3484": {
|
|
"path": "generated-edge-simstep-a2997e81-9fc8-4f9d-adf2-7fac56a58991-f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"fileName": "tutorial003.py",
|
|
"cellName": "Register Path Operation with Router",
|
|
"cellId": "f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"visible": true,
|
|
"startLine": 2150,
|
|
"endLine": 2192,
|
|
"parentPath": "docs_src/body_multiple_params/tutorial003.py"
|
|
},
|
|
"c85c9776-5f78-48a8-af8b-764a29b604fc": {
|
|
"path": "c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"fileName": "c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"cellName": "HTTP Request\nReceived",
|
|
"cellId": "c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-8a4b91fb-6482-4753-834a-2b9328f3941d-c85c9776-5f78-48a8-af8b-764a29b604fc": {
|
|
"path": "generated-edge-simstep-8a4b91fb-6482-4753-834a-2b9328f3941d-c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"fileName": "utils.py",
|
|
"cellName": "HTTP Request Received",
|
|
"cellId": "c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"visible": true,
|
|
"startLine": 1096,
|
|
"endLine": 1096,
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"c178ca0c-2977-4fc1-bba5-9daf176b094e": {
|
|
"path": "c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"fileName": "c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"cellName": "Pass Raw\nData for\nValidation",
|
|
"cellId": "c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-16cb1e94-5a42-47e2-8661-e932a4148bff-c178ca0c-2977-4fc1-bba5-9daf176b094e": {
|
|
"path": "generated-edge-simstep-16cb1e94-5a42-47e2-8661-e932a4148bff-c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"fileName": "routing.py",
|
|
"cellName": "Pass Raw Data for Validation",
|
|
"cellId": "c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"visible": true,
|
|
"startLine": 371,
|
|
"endLine": 371,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4": {
|
|
"path": "678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"fileName": "678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"cellName": "Pass Validated\nArguments to\nEndpoint Function",
|
|
"cellId": "678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-ea22f412-f25b-414f-b8de-5564d2f9a7c0-678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4": {
|
|
"path": "generated-edge-simstep-ea22f412-f25b-414f-b8de-5564d2f9a7c0-678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"fileName": "utils.py",
|
|
"cellName": "Pass Validated Arguments to Endpoint Function",
|
|
"cellId": "678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"visible": true,
|
|
"startLine": 402,
|
|
"endLine": 402,
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"2e0c66ab-b7e0-4b05-8614-eca7ab5cca17": {
|
|
"path": "2e0c66ab-b7e0-4b05-8614-eca7ab5cca17",
|
|
"fileName": "2e0c66ab-b7e0-4b05-8614-eca7ab5cca17",
|
|
"cellName": "async_tests",
|
|
"cellId": "2e0c66ab-b7e0-4b05-8614-eca7ab5cca17",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"aa72b614-49af-48c1-a5c3-3bc1b45981e5": {
|
|
"path": "aa72b614-49af-48c1-a5c3-3bc1b45981e5",
|
|
"fileName": "aa72b614-49af-48c1-a5c3-3bc1b45981e5",
|
|
"cellName": "main.py",
|
|
"cellId": "aa72b614-49af-48c1-a5c3-3bc1b45981e5",
|
|
"visible": true,
|
|
"parentCellId": "2e0c66ab-b7e0-4b05-8614-eca7ab5cca17"
|
|
},
|
|
"6d538c95-7002-4e13-a58e-42276e93a916": {
|
|
"path": "6d538c95-7002-4e13-a58e-42276e93a916",
|
|
"fileName": "6d538c95-7002-4e13-a58e-42276e93a916",
|
|
"cellName": "1. Define an Asynchronous Path Operation - main.py:L6-9",
|
|
"cellId": "6d538c95-7002-4e13-a58e-42276e93a916",
|
|
"visible": true,
|
|
"parentCellId": "aa72b614-49af-48c1-a5c3-3bc1b45981e5"
|
|
},
|
|
"docs_src/async_tests/main.py-simstep-cda447ab-9d46-497c-a8cb-c2892e622443": {
|
|
"path": "docs_src/async_tests/main.py-simstep-cda447ab-9d46-497c-a8cb-c2892e622443",
|
|
"fileName": "main.py",
|
|
"wiki": "A developer defines a path operation function using `async def`. This signals to FastAPI that the function is a coroutine, allowing for the use of `await` for non-blocking operations and enabling high concurrency.",
|
|
"cellName": "1. Define an Asynchronous Path Operation - main.py:L6-9",
|
|
"cellId": "6d538c95-7002-4e13-a58e-42276e93a916",
|
|
"visible": true,
|
|
"startLine": 6,
|
|
"endLine": 9,
|
|
"parentCellId": "aa72b614-49af-48c1-a5c3-3bc1b45981e5",
|
|
"parentPath": "docs_src/async_tests/main.py"
|
|
},
|
|
"723adc58-e008-43e8-a4a5-f27f1e5b9b72": {
|
|
"path": "723adc58-e008-43e8-a4a5-f27f1e5b9b72",
|
|
"fileName": "723adc58-e008-43e8-a4a5-f27f1e5b9b72",
|
|
"cellName": "3. ASGI Server Receives Request - applications.py:L1131-1134",
|
|
"cellId": "723adc58-e008-43e8-a4a5-f27f1e5b9b72",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-af17a645-e3b8-4db6-8ade-2962b52b1ddb": {
|
|
"path": "fastapi/applications.py-simstep-af17a645-e3b8-4db6-8ade-2962b52b1ddb",
|
|
"fileName": "applications.py",
|
|
"wiki": "An ASGI server (like Uvicorn) receives an HTTP GET request for '/'. It constructs a standard `scope` dictionary with request details and passes it to the FastAPI application's main `__call__` method.",
|
|
"cellName": "3. ASGI Server Receives Request - applications.py:L1131-1134",
|
|
"cellId": "723adc58-e008-43e8-a4a5-f27f1e5b9b72",
|
|
"visible": true,
|
|
"startLine": 1131,
|
|
"endLine": 1134,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"4d253d9a-189a-4b27-bb06-5862fbba7283": {
|
|
"path": "4d253d9a-189a-4b27-bb06-5862fbba7283",
|
|
"fileName": "4d253d9a-189a-4b27-bb06-5862fbba7283",
|
|
"cellName": "5. Select Handler based on Function Type - routing.py:L95-97",
|
|
"cellId": "4d253d9a-189a-4b27-bb06-5862fbba7283",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-cb5273ef-8960-4c8b-8195-7a6384823794": {
|
|
"path": "fastapi/routing.py-simstep-cb5273ef-8960-4c8b-8195-7a6384823794",
|
|
"fileName": "routing.py",
|
|
"wiki": "The router matches the request to the `root` function. The `request_response` wrapper checks if the handler is an async function. Since `root` was defined with `async def`, `is_async_callable` returns true, and the function is marked for direct awaiting.",
|
|
"cellName": "5. Select Handler based on Function Type - routing.py:L95-97",
|
|
"cellId": "4d253d9a-189a-4b27-bb06-5862fbba7283",
|
|
"visible": true,
|
|
"startLine": 95,
|
|
"endLine": 97,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"5be4df9c-50fb-41d0-a436-85a1be744dc5": {
|
|
"path": "5be4df9c-50fb-41d0-a436-85a1be744dc5",
|
|
"fileName": "5be4df9c-50fb-41d0-a436-85a1be744dc5",
|
|
"cellName": "7. Await the Coroutine Endpoint - routing.py:L287-288",
|
|
"cellId": "5be4df9c-50fb-41d0-a436-85a1be744dc5",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-7aee408c-be01-4088-a719-d30b71bd7973": {
|
|
"path": "fastapi/routing.py-simstep-7aee408c-be01-4088-a719-d30b71bd7973",
|
|
"fileName": "routing.py",
|
|
"wiki": "The `run_endpoint_function` checks if the handler is a coroutine. Since it is, the function is executed using `await`. This allows the event loop to switch to other tasks if the endpoint itself awaits a long-running I/O operation, preventing the server from blocking.",
|
|
"cellName": "7. Await the Coroutine Endpoint - routing.py:L287-288",
|
|
"cellId": "5be4df9c-50fb-41d0-a436-85a1be744dc5",
|
|
"visible": true,
|
|
"startLine": 287,
|
|
"endLine": 288,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"3b4760d0-0289-4c64-9a67-b0b7911cb094": {
|
|
"path": "3b4760d0-0289-4c64-9a67-b0b7911cb094",
|
|
"fileName": "3b4760d0-0289-4c64-9a67-b0b7911cb094",
|
|
"cellName": "9. Serialize the Response - routing.py:L408-415",
|
|
"cellId": "3b4760d0-0289-4c64-9a67-b0b7911cb094",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-d6a1afe7-2b97-49ad-9e12-3aa5332905b9": {
|
|
"path": "fastapi/routing.py-simstep-d6a1afe7-2b97-49ad-9e12-3aa5332905b9",
|
|
"fileName": "routing.py",
|
|
"wiki": "The `serialize_response` function is called to convert the Python dictionary returned by the endpoint into a JSON-compatible format. This process itself can be asynchronous.",
|
|
"cellName": "9. Serialize the Response - routing.py:L408-415",
|
|
"cellId": "3b4760d0-0289-4c64-9a67-b0b7911cb094",
|
|
"visible": true,
|
|
"startLine": 408,
|
|
"endLine": 415,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"b74d9193-26b0-4b98-a1dc-e55e17c8a0e4": {
|
|
"path": "b74d9193-26b0-4b98-a1dc-e55e17c8a0e4",
|
|
"fileName": "b74d9193-26b0-4b98-a1dc-e55e17c8a0e4",
|
|
"cellName": "11. Send HTTP Response via ASGI - routing.py:L106",
|
|
"cellId": "b74d9193-26b0-4b98-a1dc-e55e17c8a0e4",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-9e3b06fe-61d2-45aa-8d83-4b604ab90f36": {
|
|
"path": "fastapi/routing.py-simstep-9e3b06fe-61d2-45aa-8d83-4b604ab90f36",
|
|
"fileName": "routing.py",
|
|
"wiki": "The final `Response` object is awaited, which triggers its `__call__` method. This method uses the ASGI `send` callable provided by the server to transmit the HTTP status, headers, and body back to the client.",
|
|
"cellName": "11. Send HTTP Response via ASGI - routing.py:L106",
|
|
"cellId": "b74d9193-26b0-4b98-a1dc-e55e17c8a0e4",
|
|
"visible": true,
|
|
"startLine": 106,
|
|
"endLine": 106,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"d4810b21-a037-499b-bf29-64229b7fb89d": {
|
|
"path": "d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"fileName": "d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"cellName": "2. Application\nInitialization and\nRoute Registration",
|
|
"cellId": "d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-71aea8b0-90a3-4fcb-a6b0-f4666a7b6b51-d4810b21-a037-499b-bf29-64229b7fb89d": {
|
|
"path": "generated-edge-simstep-71aea8b0-90a3-4fcb-a6b0-f4666a7b6b51-d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"fileName": "main.py",
|
|
"cellName": "2. Application Initialization and Route Registration",
|
|
"cellId": "d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"visible": true,
|
|
"startLine": 1140,
|
|
"endLine": 1140,
|
|
"parentPath": "docs_src/async_tests/main.py"
|
|
},
|
|
"3645da23-6b02-4826-989e-51ba79139b97": {
|
|
"path": "3645da23-6b02-4826-989e-51ba79139b97",
|
|
"fileName": "3645da23-6b02-4826-989e-51ba79139b97",
|
|
"cellName": "4. Request\nPassed to\nRouter",
|
|
"cellId": "3645da23-6b02-4826-989e-51ba79139b97",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-f60b3966-22e3-435a-aace-d86055caea49-3645da23-6b02-4826-989e-51ba79139b97": {
|
|
"path": "generated-edge-simstep-f60b3966-22e3-435a-aace-d86055caea49-3645da23-6b02-4826-989e-51ba79139b97",
|
|
"fileName": "applications.py",
|
|
"cellName": "4. Request Passed to Router",
|
|
"cellId": "3645da23-6b02-4826-989e-51ba79139b97",
|
|
"visible": true,
|
|
"startLine": 1134,
|
|
"endLine": 1134,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"badccb56-99c5-43c0-8a2b-d49fb9b2c1cd": {
|
|
"path": "badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"fileName": "badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"cellName": "6. Prepare\nEndpoint Execution",
|
|
"cellId": "badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"generated-edge-simstep-514470f7-50a0-47ac-a636-8956036a0617-badccb56-99c5-43c0-8a2b-d49fb9b2c1cd": {
|
|
"path": "generated-edge-simstep-514470f7-50a0-47ac-a636-8956036a0617-badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"fileName": "routing.py",
|
|
"cellName": "6. Prepare Endpoint Execution",
|
|
"cellId": "badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"visible": true,
|
|
"startLine": 388,
|
|
"endLine": 388,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"7c922d0b-5375-43f1-9ee5-5129e67ae842": {
|
|
"path": "7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"fileName": "7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"cellName": "8. Raw\nResponse Returned",
|
|
"cellId": "7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"generated-edge-simstep-6b00d867-9ecb-4c51-be8b-06432f1af04f-7c922d0b-5375-43f1-9ee5-5129e67ae842": {
|
|
"path": "generated-edge-simstep-6b00d867-9ecb-4c51-be8b-06432f1af04f-7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"fileName": "routing.py",
|
|
"cellName": "8. Raw Response Returned",
|
|
"cellId": "7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"visible": true,
|
|
"startLine": 391,
|
|
"endLine": 391,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"3bd58e0f-f6e9-402f-9597-cee988b040b1": {
|
|
"path": "3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"fileName": "3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"cellName": "10. Create\nResponse Object",
|
|
"cellId": "3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"generated-edge-simstep-77d096c5-8eaa-4a70-a333-da9e81952a6d-3bd58e0f-f6e9-402f-9597-cee988b040b1": {
|
|
"path": "generated-edge-simstep-77d096c5-8eaa-4a70-a333-da9e81952a6d-3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"fileName": "routing.py",
|
|
"cellName": "10. Create Response Object",
|
|
"cellId": "3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"visible": true,
|
|
"startLine": 417,
|
|
"endLine": 426,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e": {
|
|
"path": "0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e",
|
|
"fileName": "0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e",
|
|
"cellName": "docs",
|
|
"cellId": "0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e",
|
|
"visible": true
|
|
},
|
|
"2de61716-262e-4677-b295-06e651ae2cdd": {
|
|
"path": "2de61716-262e-4677-b295-06e651ae2cdd",
|
|
"fileName": "2de61716-262e-4677-b295-06e651ae2cdd",
|
|
"cellName": "tests",
|
|
"cellId": "2de61716-262e-4677-b295-06e651ae2cdd",
|
|
"visible": true
|
|
},
|
|
"6dc9040b-9a18-4adc-9e48-8101ad662c99": {
|
|
"path": "6dc9040b-9a18-4adc-9e48-8101ad662c99",
|
|
"fileName": "6dc9040b-9a18-4adc-9e48-8101ad662c99",
|
|
"cellName": "app_testing",
|
|
"cellId": "6dc9040b-9a18-4adc-9e48-8101ad662c99",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"06f4c382-b166-4cc9-a342-b407504d35d8": {
|
|
"path": "06f4c382-b166-4cc9-a342-b407504d35d8",
|
|
"fileName": "06f4c382-b166-4cc9-a342-b407504d35d8",
|
|
"cellName": "testclient.py",
|
|
"cellId": "06f4c382-b166-4cc9-a342-b407504d35d8",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"eeba5834-dc44-4983-ac8f-809375127cc9": {
|
|
"path": "eeba5834-dc44-4983-ac8f-809375127cc9",
|
|
"fileName": "eeba5834-dc44-4983-ac8f-809375127cc9",
|
|
"cellName": "en",
|
|
"cellId": "eeba5834-dc44-4983-ac8f-809375127cc9",
|
|
"visible": true,
|
|
"parentCellId": "0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e"
|
|
},
|
|
"71140f40-8323-49de-9210-f33c358fa2ef": {
|
|
"path": "71140f40-8323-49de-9210-f33c358fa2ef",
|
|
"fileName": "71140f40-8323-49de-9210-f33c358fa2ef",
|
|
"cellName": "test_dependency_overrides.py",
|
|
"cellId": "71140f40-8323-49de-9210-f33c358fa2ef",
|
|
"visible": true,
|
|
"parentCellId": "2de61716-262e-4677-b295-06e651ae2cdd"
|
|
},
|
|
"43fe865e-b2ad-4d4a-963c-35618fc3cdda": {
|
|
"path": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"fileName": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"visible": true,
|
|
"parentCellId": "6dc9040b-9a18-4adc-9e48-8101ad662c99"
|
|
},
|
|
"c4536ff7-38c9-4678-8471-cc92f8c3d93f": {
|
|
"path": "c4536ff7-38c9-4678-8471-cc92f8c3d93f",
|
|
"fileName": "c4536ff7-38c9-4678-8471-cc92f8c3d93f",
|
|
"cellName": "docs",
|
|
"cellId": "c4536ff7-38c9-4678-8471-cc92f8c3d93f",
|
|
"visible": true,
|
|
"parentCellId": "eeba5834-dc44-4983-ac8f-809375127cc9"
|
|
},
|
|
"56e59fec-d559-4ecf-aa7b-24f48977311a": {
|
|
"path": "56e59fec-d559-4ecf-aa7b-24f48977311a",
|
|
"fileName": "56e59fec-d559-4ecf-aa7b-24f48977311a",
|
|
"cellName": "advanced",
|
|
"cellId": "56e59fec-d559-4ecf-aa7b-24f48977311a",
|
|
"visible": true,
|
|
"parentCellId": "c4536ff7-38c9-4678-8471-cc92f8c3d93f"
|
|
},
|
|
"824784b9-9c78-4ddc-98cc-70f65c33f4b0": {
|
|
"path": "824784b9-9c78-4ddc-98cc-70f65c33f4b0",
|
|
"fileName": "824784b9-9c78-4ddc-98cc-70f65c33f4b0",
|
|
"cellName": "testing-dependencies.md",
|
|
"cellId": "824784b9-9c78-4ddc-98cc-70f65c33f4b0",
|
|
"visible": true,
|
|
"parentCellId": "56e59fec-d559-4ecf-aa7b-24f48977311a"
|
|
},
|
|
"bf1edc05-08ee-4c1c-80cf-21b4f531e0fe": {
|
|
"path": "bf1edc05-08ee-4c1c-80cf-21b4f531e0fe",
|
|
"fileName": "bf1edc05-08ee-4c1c-80cf-21b4f531e0fe",
|
|
"cellName": "Instantiate TestClient - tutorial001.py:L12",
|
|
"cellId": "bf1edc05-08ee-4c1c-80cf-21b4f531e0fe",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"docs_src/app_testing/tutorial001.py-simstep-775603fe-da91-489f-996b-84107c8f7862": {
|
|
"path": "docs_src/app_testing/tutorial001.py-simstep-775603fe-da91-489f-996b-84107c8f7862",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "A TestClient instance is created by passing the FastAPI application object to its constructor. This client will be used to make requests to the application without a running server.",
|
|
"cellName": "Instantiate TestClient - tutorial001.py:L12",
|
|
"cellId": "bf1edc05-08ee-4c1c-80cf-21b4f531e0fe",
|
|
"visible": true,
|
|
"startLine": 12,
|
|
"endLine": 12,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"1c4e4a6c-1cb3-4852-986c-ea94a4fff224": {
|
|
"path": "1c4e4a6c-1cb3-4852-986c-ea94a4fff224",
|
|
"fileName": "1c4e4a6c-1cb3-4852-986c-ea94a4fff224",
|
|
"cellName": "Make a Request with TestClient - tutorial001.py:L16",
|
|
"cellId": "1c4e4a6c-1cb3-4852-986c-ea94a4fff224",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"docs_src/app_testing/tutorial001.py-simstep-31594c7d-7192-434e-aedb-53c1584bf215": {
|
|
"path": "docs_src/app_testing/tutorial001.py-simstep-31594c7d-7192-434e-aedb-53c1584bf215",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "The test function uses the client instance to make a simulated HTTP GET request to the `/` endpoint of the application. This call does not go through the network stack.",
|
|
"cellName": "Make a Request with TestClient - tutorial001.py:L16",
|
|
"cellId": "1c4e4a6c-1cb3-4852-986c-ea94a4fff224",
|
|
"visible": true,
|
|
"startLine": 16,
|
|
"endLine": 16,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"57c79588-0531-4abc-b526-cf50845249a7": {
|
|
"path": "57c79588-0531-4abc-b526-cf50845249a7",
|
|
"fileName": "57c79588-0531-4abc-b526-cf50845249a7",
|
|
"cellName": "Execute Path Operation Function - tutorial001.py:L8-10",
|
|
"cellId": "57c79588-0531-4abc-b526-cf50845249a7",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"docs_src/app_testing/tutorial001.py-simstep-6036575c-1bb4-44d0-b975-985fd3d17016": {
|
|
"path": "docs_src/app_testing/tutorial001.py-simstep-6036575c-1bb4-44d0-b975-985fd3d17016",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "FastAPI's router identifies the matching path operation function, `read_main`, decorated with `@app.get(\"/\")`. The function is executed and returns a dictionary.",
|
|
"cellName": "Execute Path Operation Function - tutorial001.py:L8-10",
|
|
"cellId": "57c79588-0531-4abc-b526-cf50845249a7",
|
|
"visible": true,
|
|
"startLine": 8,
|
|
"endLine": 10,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"970abd06-2dc8-4102-8055-8933609aeb67": {
|
|
"path": "970abd06-2dc8-4102-8055-8933609aeb67",
|
|
"fileName": "970abd06-2dc8-4102-8055-8933609aeb67",
|
|
"cellName": "Assert Response in Test - tutorial001.py:L17-18",
|
|
"cellId": "970abd06-2dc8-4102-8055-8933609aeb67",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"docs_src/app_testing/tutorial001.py-simstep-84a2b60d-be4a-4bba-80bc-3069c0e96cb6": {
|
|
"path": "docs_src/app_testing/tutorial001.py-simstep-84a2b60d-be4a-4bba-80bc-3069c0e96cb6",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "The test function asserts that the received response has a `200` status code and that its JSON body matches the expected content, confirming the endpoint works correctly.",
|
|
"cellName": "Assert Response in Test - tutorial001.py:L17-18",
|
|
"cellId": "970abd06-2dc8-4102-8055-8933609aeb67",
|
|
"visible": true,
|
|
"startLine": 17,
|
|
"endLine": 18,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda",
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"38c3f10f-2301-458f-8ea1-2c20041c520a": {
|
|
"path": "38c3f10f-2301-458f-8ea1-2c20041c520a",
|
|
"fileName": "38c3f10f-2301-458f-8ea1-2c20041c520a",
|
|
"cellName": "Set Dependency Override - tutorial001.py:L32",
|
|
"cellId": "38c3f10f-2301-458f-8ea1-2c20041c520a",
|
|
"visible": true,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a"
|
|
},
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-c52deddc-1975-4055-873c-0f72bf2dc3cb": {
|
|
"path": "docs_src/dependency_testing/tutorial001.py-simstep-c52deddc-1975-4055-873c-0f72bf2dc3cb",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "Before making a request, the test modifies the `app.dependency_overrides` dictionary. This maps an original dependency (`common_parameters`) to a new function (`override_dependency`) that will be executed instead during the test.",
|
|
"cellName": "Set Dependency Override - tutorial001.py:L32",
|
|
"cellId": "38c3f10f-2301-458f-8ea1-2c20041c520a",
|
|
"visible": true,
|
|
"startLine": 32,
|
|
"endLine": 32,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"71af56b2-6d44-43a3-a912-2a66fa6e854c": {
|
|
"path": "71af56b2-6d44-43a3-a912-2a66fa6e854c",
|
|
"fileName": "71af56b2-6d44-43a3-a912-2a66fa6e854c",
|
|
"cellName": "Make Request to Endpoint with Overridden Dependency - tutorial001.py:L36",
|
|
"cellId": "71af56b2-6d44-43a3-a912-2a66fa6e854c",
|
|
"visible": true,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a"
|
|
},
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-557f6440-8ca0-4cae-922e-4c5da5dc8da9": {
|
|
"path": "docs_src/dependency_testing/tutorial001.py-simstep-557f6440-8ca0-4cae-922e-4c5da5dc8da9",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "The TestClient sends a GET request to `/items/`, an endpoint that relies on the `common_parameters` dependency that was just overridden.",
|
|
"cellName": "Make Request to Endpoint with Overridden Dependency - tutorial001.py:L36",
|
|
"cellId": "71af56b2-6d44-43a3-a912-2a66fa6e854c",
|
|
"visible": true,
|
|
"startLine": 36,
|
|
"endLine": 36,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"9e49809a-f9f0-44b7-af22-ccc5f43b02c7": {
|
|
"path": "9e49809a-f9f0-44b7-af22-ccc5f43b02c7",
|
|
"fileName": "9e49809a-f9f0-44b7-af22-ccc5f43b02c7",
|
|
"cellName": "Execute Override Function - utils.py:L609-618",
|
|
"cellId": "9e49809a-f9f0-44b7-af22-ccc5f43b02c7",
|
|
"visible": true,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc"
|
|
},
|
|
"fastapi/dependencies/utils.py-simstep-62faa1e9-54f0-47a0-b0fb-edb3be742c09": {
|
|
"path": "fastapi/dependencies/utils.py-simstep-62faa1e9-54f0-47a0-b0fb-edb3be742c09",
|
|
"fileName": "utils.py",
|
|
"wiki": "The dependency injection system checks `app.dependency_overrides` and finds a match for `common_parameters`. It then executes the override function, `override_dependency`, instead of the original one.",
|
|
"cellName": "Execute Override Function - utils.py:L609-618",
|
|
"cellId": "9e49809a-f9f0-44b7-af22-ccc5f43b02c7",
|
|
"visible": true,
|
|
"startLine": 609,
|
|
"endLine": 618,
|
|
"parentCellId": "e2b03226-2d96-4294-9d12-bf891b8cfcdc",
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"0627101a-26d2-4e87-86b0-ab6e9c5e83ad": {
|
|
"path": "0627101a-26d2-4e87-86b0-ab6e9c5e83ad",
|
|
"fileName": "0627101a-26d2-4e87-86b0-ab6e9c5e83ad",
|
|
"cellName": "Assert Response with Mocked Data - tutorial001.py:L37-39",
|
|
"cellId": "0627101a-26d2-4e87-86b0-ab6e9c5e83ad",
|
|
"visible": true,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a"
|
|
},
|
|
"docs_src/dependency_testing/tutorial001.py-simstep-3b306a98-022e-4b79-9315-8d86042184d0": {
|
|
"path": "docs_src/dependency_testing/tutorial001.py-simstep-3b306a98-022e-4b79-9315-8d86042184d0",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "The test function receives the final response and asserts that its content is based on the data provided by the `override_dependency`, confirming the override was successful.",
|
|
"cellName": "Assert Response with Mocked Data - tutorial001.py:L37-39",
|
|
"cellId": "0627101a-26d2-4e87-86b0-ab6e9c5e83ad",
|
|
"visible": true,
|
|
"startLine": 37,
|
|
"endLine": 39,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a",
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"5ff2344e-a0ef-4568-8efc-3e9007a015f9": {
|
|
"path": "5ff2344e-a0ef-4568-8efc-3e9007a015f9",
|
|
"fileName": "5ff2344e-a0ef-4568-8efc-3e9007a015f9",
|
|
"cellName": "Clear Dependency Overrides - test_dependency_overrides.py:L275",
|
|
"cellId": "5ff2344e-a0ef-4568-8efc-3e9007a015f9",
|
|
"visible": true,
|
|
"parentCellId": "71140f40-8323-49de-9210-f33c358fa2ef"
|
|
},
|
|
"tests/test_dependency_overrides.py-simstep-e74a56d7-7c39-4391-8202-b685d0c85ea2": {
|
|
"path": "tests/test_dependency_overrides.py-simstep-e74a56d7-7c39-4391-8202-b685d0c85ea2",
|
|
"fileName": "test_dependency_overrides.py",
|
|
"wiki": "To prevent the override from affecting subsequent tests, the `app.dependency_overrides` dictionary is cleared by setting it to an empty dictionary. This restores the original dependencies for other tests.",
|
|
"cellName": "Clear Dependency Overrides - test_dependency_overrides.py:L275",
|
|
"cellId": "5ff2344e-a0ef-4568-8efc-3e9007a015f9",
|
|
"visible": true,
|
|
"startLine": 275,
|
|
"endLine": 275,
|
|
"parentCellId": "71140f40-8323-49de-9210-f33c358fa2ef",
|
|
"parentPath": "tests/test_dependency_overrides.py"
|
|
},
|
|
"1d40db3a-214d-4571-a103-38478d8d830a": {
|
|
"path": "1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"fileName": "1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"cellName": "Application Passed\nto TestClient",
|
|
"cellId": "1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"generated-edge-simstep-a26868d0-9f91-4185-8655-04b861761020-1d40db3a-214d-4571-a103-38478d8d830a": {
|
|
"path": "generated-edge-simstep-a26868d0-9f91-4185-8655-04b861761020-1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Application Passed to TestClient",
|
|
"cellId": "1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"visible": true,
|
|
"startLine": 2,
|
|
"endLine": 2,
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"0a7b0cb1-c602-4466-a1e8-6f2b076c75f5": {
|
|
"path": "0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"fileName": "0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"cellName": "Request Dispatched\nto FastAPI\nApp",
|
|
"cellId": "0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"generated-edge-simstep-a9785563-55e1-46e5-8f87-ea5544bb32a0-0a7b0cb1-c602-4466-a1e8-6f2b076c75f5": {
|
|
"path": "generated-edge-simstep-a9785563-55e1-46e5-8f87-ea5544bb32a0-0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Request Dispatched to FastAPI App",
|
|
"cellId": "0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"visible": true,
|
|
"startLine": 16,
|
|
"endLine": 16,
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"a28abe3f-2890-4751-a4c2-042299a647a1": {
|
|
"path": "a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"fileName": "a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"cellName": "Response Returned\nto TestClient",
|
|
"cellId": "a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"visible": true,
|
|
"parentCellId": "43fe865e-b2ad-4d4a-963c-35618fc3cdda"
|
|
},
|
|
"generated-edge-simstep-94a37941-4c78-4ba5-9a30-98a78e824b1e-a28abe3f-2890-4751-a4c2-042299a647a1": {
|
|
"path": "generated-edge-simstep-94a37941-4c78-4ba5-9a30-98a78e824b1e-a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Response Returned to TestClient",
|
|
"cellId": "a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"visible": true,
|
|
"startLine": 10,
|
|
"endLine": 10,
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"cebf7614-db24-432b-869f-fd8c57568bf7": {
|
|
"path": "cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"fileName": "cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"cellName": "Transition to\nDependency Override",
|
|
"cellId": "cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"generated-edge-simstep-749ef148-2b08-4234-9248-1ef9325528d3-cebf7614-db24-432b-869f-fd8c57568bf7": {
|
|
"path": "generated-edge-simstep-749ef148-2b08-4234-9248-1ef9325528d3-cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Transition to Dependency Override",
|
|
"cellId": "cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"visible": true,
|
|
"startLine": 19,
|
|
"endLine": 22,
|
|
"parentPath": "docs_src/app_testing/tutorial001.py"
|
|
},
|
|
"ea2a2c4d-e465-4003-8375-a3c644eea489": {
|
|
"path": "ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"fileName": "ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"cellName": "Override Stored\nin App",
|
|
"cellId": "ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"visible": true,
|
|
"parentCellId": "2b02df7f-6022-4e24-9de1-76f9379fee9a"
|
|
},
|
|
"generated-edge-simstep-13ed8244-da90-47be-a387-2648e230906f-ea2a2c4d-e465-4003-8375-a3c644eea489": {
|
|
"path": "generated-edge-simstep-13ed8244-da90-47be-a387-2648e230906f-ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Override Stored in App",
|
|
"cellId": "ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"visible": true,
|
|
"startLine": 947,
|
|
"endLine": 953,
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"b45dcb5e-18e8-46a3-95d0-7911502d6f89": {
|
|
"path": "b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"fileName": "b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"cellName": "Request Triggers\nDependency Resolution",
|
|
"cellId": "b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-608b856c-54dd-438b-ab09-0d8162edbb10-b45dcb5e-18e8-46a3-95d0-7911502d6f89": {
|
|
"path": "generated-edge-simstep-608b856c-54dd-438b-ab09-0d8162edbb10-b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Request Triggers Dependency Resolution",
|
|
"cellId": "b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"visible": true,
|
|
"startLine": 377,
|
|
"endLine": 383,
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7": {
|
|
"path": "3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"fileName": "3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"cellName": "Inject Mock\nData into\nEndpoint",
|
|
"cellId": "3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-d3f981a3-7782-49a8-901b-5103f3c6317f-3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7": {
|
|
"path": "generated-edge-simstep-d3f981a3-7782-49a8-901b-5103f3c6317f-3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"fileName": "utils.py",
|
|
"cellName": "Inject Mock Data into Endpoint",
|
|
"cellId": "3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"visible": true,
|
|
"startLine": 17,
|
|
"endLine": 17,
|
|
"parentPath": "fastapi/dependencies/utils.py"
|
|
},
|
|
"19928fa5-ddd3-422d-8617-7f4b84e33ba7": {
|
|
"path": "19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"fileName": "19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"cellName": "Prepare for\nTest Teardown",
|
|
"cellId": "19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-d351ce27-af6c-4deb-b663-45e7cdc3a807-19928fa5-ddd3-422d-8617-7f4b84e33ba7": {
|
|
"path": "generated-edge-simstep-d351ce27-af6c-4deb-b663-45e7cdc3a807-19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Prepare for Test Teardown",
|
|
"cellId": "19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"visible": true,
|
|
"startLine": 275,
|
|
"endLine": 275,
|
|
"parentPath": "docs_src/dependency_testing/tutorial001.py"
|
|
},
|
|
"b61db9f9-9cf6-428b-9da7-92da54855cd7": {
|
|
"path": "b61db9f9-9cf6-428b-9da7-92da54855cd7",
|
|
"fileName": "b61db9f9-9cf6-428b-9da7-92da54855cd7",
|
|
"cellName": "items.py",
|
|
"cellId": "b61db9f9-9cf6-428b-9da7-92da54855cd7",
|
|
"visible": true,
|
|
"parentCellId": "24b16353-49e5-4230-9464-c645c55926e0"
|
|
},
|
|
"603b4eb9-d4e5-4d23-b806-e5d29565c715": {
|
|
"path": "603b4eb9-d4e5-4d23-b806-e5d29565c715",
|
|
"fileName": "603b4eb9-d4e5-4d23-b806-e5d29565c715",
|
|
"cellName": "Define User-Related Routes - users.py:L3-8",
|
|
"cellId": "603b4eb9-d4e5-4d23-b806-e5d29565c715",
|
|
"visible": true,
|
|
"parentCellId": "26a92877-c137-468e-a7e8-766790d0a44c"
|
|
},
|
|
"docs_src/bigger_applications/app/routers/users.py-simstep-d50816dd-f2a3-4fa9-8fb5-ef6a35151ca6": {
|
|
"path": "docs_src/bigger_applications/app/routers/users.py-simstep-d50816dd-f2a3-4fa9-8fb5-ef6a35151ca6",
|
|
"fileName": "users.py",
|
|
"wiki": "In a dedicated module `users.py`, an `APIRouter` instance is created to group user-related endpoints. Path operations, like a GET endpoint to read users, are defined on this router using decorators. This promotes code modularity.",
|
|
"cellName": "Define User-Related Routes - users.py:L3-8",
|
|
"cellId": "603b4eb9-d4e5-4d23-b806-e5d29565c715",
|
|
"visible": true,
|
|
"startLine": 3,
|
|
"endLine": 8,
|
|
"parentCellId": "26a92877-c137-468e-a7e8-766790d0a44c",
|
|
"parentPath": "docs_src/bigger_applications/app/routers/users.py"
|
|
},
|
|
"f9a14e30-e10d-4e53-a595-158cce2646a0": {
|
|
"path": "f9a14e30-e10d-4e53-a595-158cce2646a0",
|
|
"fileName": "f9a14e30-e10d-4e53-a595-158cce2646a0",
|
|
"cellName": "Define Item Router with Shared Configuration - items.py:L5-10",
|
|
"cellId": "f9a14e30-e10d-4e53-a595-158cce2646a0",
|
|
"visible": true,
|
|
"parentCellId": "b61db9f9-9cf6-428b-9da7-92da54855cd7"
|
|
},
|
|
"docs_src/bigger_applications/app/routers/items.py-simstep-e0b88502-55e5-4b9c-a970-9b325ed8a8e2": {
|
|
"path": "docs_src/bigger_applications/app/routers/items.py-simstep-e0b88502-55e5-4b9c-a970-9b325ed8a8e2",
|
|
"fileName": "items.py",
|
|
"wiki": "Similarly, in `items.py`, another `APIRouter` is created. This time, it's configured with shared parameters like a URL `prefix` ('/items'), `tags`, `dependencies`, and default `responses` that will apply to all path operations defined within this router.",
|
|
"cellName": "Define Item Router with Shared Configuration - items.py:L5-10",
|
|
"cellId": "f9a14e30-e10d-4e53-a595-158cce2646a0",
|
|
"visible": true,
|
|
"startLine": 5,
|
|
"endLine": 10,
|
|
"parentCellId": "b61db9f9-9cf6-428b-9da7-92da54855cd7",
|
|
"parentPath": "docs_src/bigger_applications/app/routers/items.py"
|
|
},
|
|
"906297f0-cfb7-4c0f-b6cf-47ee77938360": {
|
|
"path": "906297f0-cfb7-4c0f-b6cf-47ee77938360",
|
|
"fileName": "906297f0-cfb7-4c0f-b6cf-47ee77938360",
|
|
"cellName": "Create Main FastAPI Application - main.py:L8",
|
|
"cellId": "906297f0-cfb7-4c0f-b6cf-47ee77938360",
|
|
"visible": true,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856"
|
|
},
|
|
"docs_src/bigger_applications/app/main.py-simstep-99aeff6f-e85d-4990-8fbd-3ebab1aa05fe": {
|
|
"path": "docs_src/bigger_applications/app/main.py-simstep-99aeff6f-e85d-4990-8fbd-3ebab1aa05fe",
|
|
"fileName": "main.py",
|
|
"wiki": "In the main application file, `main.py`, an instance of the `FastAPI` class is created. This `app` object will serve as the central point for the entire web application, aggregating all the modular routers.",
|
|
"cellName": "Create Main FastAPI Application - main.py:L8",
|
|
"cellId": "906297f0-cfb7-4c0f-b6cf-47ee77938360",
|
|
"visible": true,
|
|
"startLine": 8,
|
|
"endLine": 8,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"parentPath": "docs_src/bigger_applications/app/main.py"
|
|
},
|
|
"4007f37b-ba49-4437-918a-380bc8859f5a": {
|
|
"path": "4007f37b-ba49-4437-918a-380bc8859f5a",
|
|
"fileName": "4007f37b-ba49-4437-918a-380bc8859f5a",
|
|
"cellName": "Include Routers into the Main App - main.py:L11-12",
|
|
"cellId": "4007f37b-ba49-4437-918a-380bc8859f5a",
|
|
"visible": true,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856"
|
|
},
|
|
"docs_src/bigger_applications/app/main.py-simstep-cfcc3244-3cb4-40fc-9208-ebe7d0feac88": {
|
|
"path": "docs_src/bigger_applications/app/main.py-simstep-cfcc3244-3cb4-40fc-9208-ebe7d0feac88",
|
|
"fileName": "main.py",
|
|
"wiki": "The `app.include_router()` method is called for each imported router (`users.router`, `items.router`). This method is the key to combining the modularized endpoints into the main application.",
|
|
"cellName": "Include Routers into the Main App - main.py:L11-12",
|
|
"cellId": "4007f37b-ba49-4437-918a-380bc8859f5a",
|
|
"visible": true,
|
|
"startLine": 11,
|
|
"endLine": 12,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"parentPath": "docs_src/bigger_applications/app/main.py"
|
|
},
|
|
"02519ecd-f449-46a3-8430-6cf6760a4263": {
|
|
"path": "02519ecd-f449-46a3-8430-6cf6760a4263",
|
|
"fileName": "02519ecd-f449-46a3-8430-6cf6760a4263",
|
|
"cellName": "Process and Add Routes to Main App - routing.py:L1348-1383",
|
|
"cellId": "02519ecd-f449-46a3-8430-6cf6760a4263",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-ddd8a50b-d021-4486-a599-9cee3495e6e8": {
|
|
"path": "fastapi/routing.py-simstep-ddd8a50b-d021-4486-a599-9cee3495e6e8",
|
|
"fileName": "routing.py",
|
|
"wiki": "The core logic inside `APIRouter.include_router` iterates through each route from the provided router. It combines the `prefix` from the `include_router` call with the route's own path, and merges tags, dependencies, and responses before adding the final, fully-configured route to the main application's routing table.",
|
|
"cellName": "Process and Add Routes to Main App - routing.py:L1348-1383",
|
|
"cellId": "02519ecd-f449-46a3-8430-6cf6760a4263",
|
|
"visible": true,
|
|
"startLine": 1348,
|
|
"endLine": 1383,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"da65836d-fde5-450b-a63f-8856ed4ef131": {
|
|
"path": "da65836d-fde5-450b-a63f-8856ed4ef131",
|
|
"fileName": "da65836d-fde5-450b-a63f-8856ed4ef131",
|
|
"cellName": "Include Router with Overriding Configuration - main.py:L13-18",
|
|
"cellId": "da65836d-fde5-450b-a63f-8856ed4ef131",
|
|
"visible": true,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856"
|
|
},
|
|
"docs_src/bigger_applications/app/main.py-simstep-7e887cf3-4cfc-48ab-b9c7-40c2883d8138": {
|
|
"path": "docs_src/bigger_applications/app/main.py-simstep-7e887cf3-4cfc-48ab-b9c7-40c2883d8138",
|
|
"fileName": "main.py",
|
|
"wiki": "A third router, `admin.router`, is included. This time, the `app.include_router` call provides a `prefix`, `tags`, and `dependencies`. This demonstrates how to apply app-specific configurations to a generic, reusable router without modifying its source code.",
|
|
"cellName": "Include Router with Overriding Configuration - main.py:L13-18",
|
|
"cellId": "da65836d-fde5-450b-a63f-8856ed4ef131",
|
|
"visible": true,
|
|
"startLine": 13,
|
|
"endLine": 18,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856",
|
|
"parentPath": "docs_src/bigger_applications/app/main.py"
|
|
},
|
|
"39f855f0-2d15-4865-90bf-cce2d20bb759": {
|
|
"path": "39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"fileName": "39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"cellName": "User Router\nObject Created",
|
|
"cellId": "39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"visible": true,
|
|
"parentCellId": "24b16353-49e5-4230-9464-c645c55926e0"
|
|
},
|
|
"generated-edge-simstep-d38d244e-dd81-47db-a290-4b9d16b30792-39f855f0-2d15-4865-90bf-cce2d20bb759": {
|
|
"path": "generated-edge-simstep-d38d244e-dd81-47db-a290-4b9d16b30792-39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"fileName": "users.py",
|
|
"cellName": "User Router Object Created",
|
|
"cellId": "39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"visible": true,
|
|
"startLine": 3,
|
|
"endLine": 3,
|
|
"parentPath": "docs_src/bigger_applications/app/routers/users.py"
|
|
},
|
|
"eff4590a-a5ea-4a00-b6ff-d997c92439f0": {
|
|
"path": "eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"fileName": "eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"cellName": "Item Router\nObject Created",
|
|
"cellId": "eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"visible": true,
|
|
"parentCellId": "ced0be04-1104-44cf-9102-bd03eb76b5fc"
|
|
},
|
|
"generated-edge-simstep-798e0b67-70cc-409b-9f66-4f20967121b6-eff4590a-a5ea-4a00-b6ff-d997c92439f0": {
|
|
"path": "generated-edge-simstep-798e0b67-70cc-409b-9f66-4f20967121b6-eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"fileName": "items.py",
|
|
"cellName": "Item Router Object Created",
|
|
"cellId": "eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"visible": true,
|
|
"startLine": 5,
|
|
"endLine": 5,
|
|
"parentPath": "docs_src/bigger_applications/app/routers/items.py"
|
|
},
|
|
"5e1e692a-53ef-4b61-9274-643796cecc8e": {
|
|
"path": "5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"fileName": "5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"cellName": "App Instance\nReady for\nRouters",
|
|
"cellId": "5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"visible": true,
|
|
"parentCellId": "8f4c6c49-0848-4c53-942f-8faa44426856"
|
|
},
|
|
"generated-edge-simstep-9afe704a-5961-478e-92ca-d07b76735226-5e1e692a-53ef-4b61-9274-643796cecc8e": {
|
|
"path": "generated-edge-simstep-9afe704a-5961-478e-92ca-d07b76735226-5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"fileName": "main.py",
|
|
"cellName": "App Instance Ready for Routers",
|
|
"cellId": "5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"visible": true,
|
|
"startLine": 4,
|
|
"endLine": 5,
|
|
"parentPath": "docs_src/bigger_applications/app/main.py"
|
|
},
|
|
"c3e08f7d-6ac8-4d7e-ab26-246ab6656e99": {
|
|
"path": "c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"fileName": "c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"cellName": "Delegate Router\nInclusion",
|
|
"cellId": "c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-1568332d-f98c-4c7f-a8d6-83920b8356f6-c3e08f7d-6ac8-4d7e-ab26-246ab6656e99": {
|
|
"path": "generated-edge-simstep-1568332d-f98c-4c7f-a8d6-83920b8356f6-c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"fileName": "main.py",
|
|
"cellName": "Delegate Router Inclusion",
|
|
"cellId": "c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"visible": true,
|
|
"startLine": 1519,
|
|
"endLine": 1532,
|
|
"parentPath": "docs_src/bigger_applications/app/main.py"
|
|
},
|
|
"28e77bbc-acde-44e2-9e00-47f86912cb89": {
|
|
"path": "28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"fileName": "28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"cellName": "Application Routes\nUpdated",
|
|
"cellId": "28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-8665befb-71e3-427e-b910-b262610cd999-28e77bbc-acde-44e2-9e00-47f86912cb89": {
|
|
"path": "generated-edge-simstep-8665befb-71e3-427e-b910-b262610cd999-28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"fileName": "routing.py",
|
|
"cellName": "Application Routes Updated",
|
|
"cellId": "28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"visible": true,
|
|
"startLine": 1377,
|
|
"endLine": 1383,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"7f9cc00d-55b1-43c7-926c-8cea814fb472": {
|
|
"path": "7f9cc00d-55b1-43c7-926c-8cea814fb472",
|
|
"fileName": "7f9cc00d-55b1-43c7-926c-8cea814fb472",
|
|
"cellName": "handling_errors",
|
|
"cellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472",
|
|
"visible": true,
|
|
"parentCellId": "14b2cbb7-2b14-4ed5-bee3-bd64cbea747e"
|
|
},
|
|
"a5da997e-779f-443c-817f-711373a86660": {
|
|
"path": "a5da997e-779f-443c-817f-711373a86660",
|
|
"fileName": "a5da997e-779f-443c-817f-711373a86660",
|
|
"cellName": "exception_handlers.py",
|
|
"cellId": "a5da997e-779f-443c-817f-711373a86660",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"d35761a9-d525-4ba8-a82f-27021eff54c0": {
|
|
"path": "d35761a9-d525-4ba8-a82f-27021eff54c0",
|
|
"fileName": "d35761a9-d525-4ba8-a82f-27021eff54c0",
|
|
"cellName": "tutorial001.py",
|
|
"cellId": "d35761a9-d525-4ba8-a82f-27021eff54c0",
|
|
"visible": true,
|
|
"parentCellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472"
|
|
},
|
|
"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f": {
|
|
"path": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"fileName": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"cellName": "tutorial004.py",
|
|
"cellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"visible": true,
|
|
"parentCellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472"
|
|
},
|
|
"a01899f9-de7d-4a39-8f81-ae24c94c1008": {
|
|
"path": "a01899f9-de7d-4a39-8f81-ae24c94c1008",
|
|
"fileName": "a01899f9-de7d-4a39-8f81-ae24c94c1008",
|
|
"cellName": "tutorial006.py",
|
|
"cellId": "a01899f9-de7d-4a39-8f81-ae24c94c1008",
|
|
"visible": true,
|
|
"parentCellId": "7f9cc00d-55b1-43c7-926c-8cea814fb472"
|
|
},
|
|
"cc96ff59-f849-4fc3-8c77-3c015a9af800": {
|
|
"path": "cc96ff59-f849-4fc3-8c77-3c015a9af800",
|
|
"fileName": "cc96ff59-f849-4fc3-8c77-3c015a9af800",
|
|
"cellName": "Flow 1: Path Operation Raises HTTPException - tutorial001.py:L11-12",
|
|
"cellId": "cc96ff59-f849-4fc3-8c77-3c015a9af800",
|
|
"visible": true,
|
|
"parentCellId": "d35761a9-d525-4ba8-a82f-27021eff54c0"
|
|
},
|
|
"docs_src/handling_errors/tutorial001.py-simstep-215fc83a-81b9-4126-98aa-43ceba5fd293": {
|
|
"path": "docs_src/handling_errors/tutorial001.py-simstep-215fc83a-81b9-4126-98aa-43ceba5fd293",
|
|
"fileName": "tutorial001.py",
|
|
"wiki": "A client requests an item with an ID that triggers a specific business logic error. The application logic checks for this condition (e.g., a specific item ID is disallowed) and raises an `HTTPException` to immediately stop processing and return a specific HTTP error.",
|
|
"cellName": "Flow 1: Path Operation Raises HTTPException - tutorial001.py:L11-12",
|
|
"cellId": "cc96ff59-f849-4fc3-8c77-3c015a9af800",
|
|
"visible": true,
|
|
"startLine": 11,
|
|
"endLine": 12,
|
|
"parentCellId": "d35761a9-d525-4ba8-a82f-27021eff54c0",
|
|
"parentPath": "docs_src/handling_errors/tutorial001.py"
|
|
},
|
|
"dc65b6d2-aebe-4270-a674-6ac2fb83c227": {
|
|
"path": "dc65b6d2-aebe-4270-a674-6ac2fb83c227",
|
|
"fileName": "dc65b6d2-aebe-4270-a674-6ac2fb83c227",
|
|
"cellName": "Flow 1: Default Exception Handler Invoked - applications.py:L981-982",
|
|
"cellId": "dc65b6d2-aebe-4270-a674-6ac2fb83c227",
|
|
"visible": true,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57"
|
|
},
|
|
"fastapi/applications.py-simstep-b16094b3-792f-4a5b-aa82-614601c2e75c": {
|
|
"path": "fastapi/applications.py-simstep-b16094b3-792f-4a5b-aa82-614601c2e75c",
|
|
"fileName": "applications.py",
|
|
"wiki": "FastAPI's internal `ExceptionMiddleware` catches the `HTTPException`. It looks up the registered handler for this exception type, which, by default, is FastAPI's built-in `http_exception_handler`.",
|
|
"cellName": "Flow 1: Default Exception Handler Invoked - applications.py:L981-982",
|
|
"cellId": "dc65b6d2-aebe-4270-a674-6ac2fb83c227",
|
|
"visible": true,
|
|
"startLine": 981,
|
|
"endLine": 982,
|
|
"parentCellId": "7f6f82df-82d2-40de-96d9-e51093e8ee57",
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"326d1002-39bf-4422-8057-7ba0a4bdd024": {
|
|
"path": "326d1002-39bf-4422-8057-7ba0a4bdd024",
|
|
"fileName": "326d1002-39bf-4422-8057-7ba0a4bdd024",
|
|
"cellName": "Flow 1: Default Handler Creates JSON Response - exception_handlers.py:L10-16",
|
|
"cellId": "326d1002-39bf-4422-8057-7ba0a4bdd024",
|
|
"visible": true,
|
|
"parentCellId": "a5da997e-779f-443c-817f-711373a86660"
|
|
},
|
|
"fastapi/exception_handlers.py-simstep-add0b602-fe90-4174-9cd5-e6b9f89a0144": {
|
|
"path": "fastapi/exception_handlers.py-simstep-add0b602-fe90-4174-9cd5-e6b9f89a0144",
|
|
"fileName": "exception_handlers.py",
|
|
"wiki": "The `http_exception_handler` function takes the status code and detail from the exception object and formats them into a standard `JSONResponse`, ensuring a consistent error structure for the client.",
|
|
"cellName": "Flow 1: Default Handler Creates JSON Response - exception_handlers.py:L10-16",
|
|
"cellId": "326d1002-39bf-4422-8057-7ba0a4bdd024",
|
|
"visible": true,
|
|
"startLine": 10,
|
|
"endLine": 16,
|
|
"parentCellId": "a5da997e-779f-443c-817f-711373a86660",
|
|
"parentPath": "fastapi/exception_handlers.py"
|
|
},
|
|
"aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a": {
|
|
"path": "aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a",
|
|
"fileName": "aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a",
|
|
"cellName": "Flow 2: Invalid Request Data Received - tutorial004.py:L22",
|
|
"cellId": "aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a",
|
|
"visible": true,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f"
|
|
},
|
|
"docs_src/handling_errors/tutorial004.py-simstep-67f98fe6-fc9a-4d2a-9d93-c141e1662671": {
|
|
"path": "docs_src/handling_errors/tutorial004.py-simstep-67f98fe6-fc9a-4d2a-9d93-c141e1662671",
|
|
"fileName": "tutorial004.py",
|
|
"wiki": "A client sends a request to an endpoint where a path parameter is expected to be an integer, but a string is provided. For example, a GET request to `/items/foo`.",
|
|
"cellName": "Flow 2: Invalid Request Data Received - tutorial004.py:L22",
|
|
"cellId": "aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a",
|
|
"visible": true,
|
|
"startLine": 22,
|
|
"endLine": 22,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
},
|
|
"a3ba77cb-c744-499b-96cc-aac2b755d957": {
|
|
"path": "a3ba77cb-c744-499b-96cc-aac2b755d957",
|
|
"fileName": "a3ba77cb-c744-499b-96cc-aac2b755d957",
|
|
"cellName": "Flow 2: FastAPI Raises RequestValidationError - routing.py:L426-429",
|
|
"cellId": "a3ba77cb-c744-499b-96cc-aac2b755d957",
|
|
"visible": true,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912"
|
|
},
|
|
"fastapi/routing.py-simstep-4d9c03e8-d9ae-4e75-ad27-a5030492d468": {
|
|
"path": "fastapi/routing.py-simstep-4d9c03e8-d9ae-4e75-ad27-a5030492d468",
|
|
"fileName": "routing.py",
|
|
"wiki": "After collecting all validation failures, FastAPI internally raises a `RequestValidationError`, which encapsulates detailed information about each error, including its location and type.",
|
|
"cellName": "Flow 2: FastAPI Raises RequestValidationError - routing.py:L426-429",
|
|
"cellId": "a3ba77cb-c744-499b-96cc-aac2b755d957",
|
|
"visible": true,
|
|
"startLine": 426,
|
|
"endLine": 429,
|
|
"parentCellId": "bc147214-42a2-42c3-a92c-ed7b8996b912",
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"89c7b37c-31a9-4b7c-8152-a69518ca096e": {
|
|
"path": "89c7b37c-31a9-4b7c-8152-a69518ca096e",
|
|
"fileName": "89c7b37c-31a9-4b7c-8152-a69518ca096e",
|
|
"cellName": "Flow 2: Default Validation Handler Creates Response - exception_handlers.py:L19-25",
|
|
"cellId": "89c7b37c-31a9-4b7c-8152-a69518ca096e",
|
|
"visible": true,
|
|
"parentCellId": "a5da997e-779f-443c-817f-711373a86660"
|
|
},
|
|
"fastapi/exception_handlers.py-simstep-38f93061-0b96-4fab-9004-8523f30d77c2": {
|
|
"path": "fastapi/exception_handlers.py-simstep-38f93061-0b96-4fab-9004-8523f30d77c2",
|
|
"fileName": "exception_handlers.py",
|
|
"wiki": "The middleware invokes the default handler for validation errors, `request_validation_exception_handler`. This handler formats the error details into a structured JSON object with a 422 Unprocessable Entity status code.",
|
|
"cellName": "Flow 2: Default Validation Handler Creates Response - exception_handlers.py:L19-25",
|
|
"cellId": "89c7b37c-31a9-4b7c-8152-a69518ca096e",
|
|
"visible": true,
|
|
"startLine": 19,
|
|
"endLine": 25,
|
|
"parentCellId": "a5da997e-779f-443c-817f-711373a86660",
|
|
"parentPath": "fastapi/exception_handlers.py"
|
|
},
|
|
"ca47235c-5df6-4452-a574-2e6e3aa67b1b": {
|
|
"path": "ca47235c-5df6-4452-a574-2e6e3aa67b1b",
|
|
"fileName": "ca47235c-5df6-4452-a574-2e6e3aa67b1b",
|
|
"cellName": "Flow 3: Define and Register Custom Handlers - tutorial004.py:L9-18",
|
|
"cellId": "ca47235c-5df6-4452-a574-2e6e3aa67b1b",
|
|
"visible": true,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f"
|
|
},
|
|
"docs_src/handling_errors/tutorial004.py-simstep-fead7102-4576-468b-b4c4-d7f7d3d02160": {
|
|
"path": "docs_src/handling_errors/tutorial004.py-simstep-fead7102-4576-468b-b4c4-d7f7d3d02160",
|
|
"fileName": "tutorial004.py",
|
|
"wiki": "During application setup, a developer defines custom functions to handle specific exceptions. The `@app.exception_handler` decorator registers these functions, overriding FastAPI's default handlers for `HTTPException` and `RequestValidationError`.",
|
|
"cellName": "Flow 3: Define and Register Custom Handlers - tutorial004.py:L9-18",
|
|
"cellId": "ca47235c-5df6-4452-a574-2e6e3aa67b1b",
|
|
"visible": true,
|
|
"startLine": 9,
|
|
"endLine": 18,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
},
|
|
"2fac3163-54f8-456c-890c-17c6430e406d": {
|
|
"path": "2fac3163-54f8-456c-890c-17c6430e406d",
|
|
"fileName": "2fac3163-54f8-456c-890c-17c6430e406d",
|
|
"cellName": "Flow 3: Custom Handler is Invoked - tutorial004.py:L15-18",
|
|
"cellId": "2fac3163-54f8-456c-890c-17c6430e406d",
|
|
"visible": true,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f"
|
|
},
|
|
"docs_src/handling_errors/tutorial004.py-simstep-c95e0d66-70bd-4d66-a616-cfe44a6b3131": {
|
|
"path": "docs_src/handling_errors/tutorial004.py-simstep-c95e0d66-70bd-4d66-a616-cfe44a6b3131",
|
|
"fileName": "tutorial004.py",
|
|
"wiki": "The `ExceptionMiddleware` finds the developer-registered handler instead of the default one. It invokes the custom `validation_exception_handler`, passing it the request and the exception.",
|
|
"cellName": "Flow 3: Custom Handler is Invoked - tutorial004.py:L15-18",
|
|
"cellId": "2fac3163-54f8-456c-890c-17c6430e406d",
|
|
"visible": true,
|
|
"startLine": 15,
|
|
"endLine": 18,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
},
|
|
"4422434a-fd9d-4a7f-bae3-d67280e39a7e": {
|
|
"path": "4422434a-fd9d-4a7f-bae3-d67280e39a7e",
|
|
"fileName": "4422434a-fd9d-4a7f-bae3-d67280e39a7e",
|
|
"cellName": "Flow 3: Custom Response is Generated - tutorial004.py:L17-18",
|
|
"cellId": "4422434a-fd9d-4a7f-bae3-d67280e39a7e",
|
|
"visible": true,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f"
|
|
},
|
|
"docs_src/handling_errors/tutorial004.py-simstep-f8ecd5a4-aee3-42bf-9e54-d44c44d550ee": {
|
|
"path": "docs_src/handling_errors/tutorial004.py-simstep-f8ecd5a4-aee3-42bf-9e54-d44c44d550ee",
|
|
"fileName": "tutorial004.py",
|
|
"wiki": "The custom handler's logic is executed. In this case, it converts the exception to a string and returns a `PlainTextResponse` with a 400 status code, differing from the default 422 JSON response.",
|
|
"cellName": "Flow 3: Custom Response is Generated - tutorial004.py:L17-18",
|
|
"cellId": "4422434a-fd9d-4a7f-bae3-d67280e39a7e",
|
|
"visible": true,
|
|
"startLine": 17,
|
|
"endLine": 18,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f",
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
},
|
|
"4228354c-d857-427e-a55e-eae5cc0a0406": {
|
|
"path": "4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"fileName": "4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"cellName": "Flow 1:\nException Propagation",
|
|
"cellId": "4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-3196e6b3-136a-4043-a63b-6cb5111f76c4-4228354c-d857-427e-a55e-eae5cc0a0406": {
|
|
"path": "generated-edge-simstep-3196e6b3-136a-4043-a63b-6cb5111f76c4-4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"fileName": "tutorial001.py",
|
|
"cellName": "Flow 1: Exception Propagation",
|
|
"cellId": "4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"visible": true,
|
|
"startLine": 363,
|
|
"endLine": 365,
|
|
"parentPath": "docs_src/handling_errors/tutorial001.py"
|
|
},
|
|
"fc2d073c-7206-4740-9d83-f258184c8226": {
|
|
"path": "fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"fileName": "fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"cellName": "Flow 1:\nData Passed\nto Handler",
|
|
"cellId": "fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-e64de2a8-6902-48ca-9640-98ac713f199a-fc2d073c-7206-4740-9d83-f258184c8226": {
|
|
"path": "generated-edge-simstep-e64de2a8-6902-48ca-9640-98ac713f199a-fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"fileName": "applications.py",
|
|
"cellName": "Flow 1: Data Passed to Handler",
|
|
"cellId": "fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"visible": true,
|
|
"startLine": 1014,
|
|
"endLine": 1014,
|
|
"parentPath": "fastapi/applications.py"
|
|
},
|
|
"458cb68b-a494-4b53-adf8-5d96d8d30f6f": {
|
|
"path": "458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"fileName": "458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"cellName": "Flow 1:\nTransmit Final\nHTTP Error\nResponse",
|
|
"cellId": "458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-d42f179f-3990-4e75-a858-54d473837db3-458cb68b-a494-4b53-adf8-5d96d8d30f6f": {
|
|
"path": "generated-edge-simstep-d42f179f-3990-4e75-a858-54d473837db3-458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"fileName": "exception_handlers.py",
|
|
"cellName": "Flow 1: Transmit Final HTTP Error Response",
|
|
"cellId": "458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"visible": true,
|
|
"startLine": 14,
|
|
"endLine": 16,
|
|
"parentPath": "fastapi/exception_handlers.py"
|
|
},
|
|
"e4285640-4dfa-4273-ac7a-81d5752548d0": {
|
|
"path": "e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"fileName": "e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"cellName": "Flow 2:\nData Validation\nFails",
|
|
"cellId": "e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-e60d5731-fd37-4e6b-a775-849fe7024e2c-e4285640-4dfa-4273-ac7a-81d5752548d0": {
|
|
"path": "generated-edge-simstep-e60d5731-fd37-4e6b-a775-849fe7024e2c-e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"fileName": "tutorial004.py",
|
|
"cellName": "Flow 2: Data Validation Fails",
|
|
"cellId": "e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"visible": true,
|
|
"startLine": 419,
|
|
"endLine": 425,
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
},
|
|
"41851979-7fc5-43e6-a100-0ee9357cb22a": {
|
|
"path": "41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"fileName": "41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"cellName": "Flow 2:\nException Caught\nby Middleware",
|
|
"cellId": "41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"visible": true,
|
|
"parentCellId": "e3327eea-4b00-4760-81fc-439223e65b7b"
|
|
},
|
|
"generated-edge-simstep-82b45422-fa0f-4098-8a60-ce7053307d29-41851979-7fc5-43e6-a100-0ee9357cb22a": {
|
|
"path": "generated-edge-simstep-82b45422-fa0f-4098-8a60-ce7053307d29-41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"fileName": "routing.py",
|
|
"cellName": "Flow 2: Exception Caught by Middleware",
|
|
"cellId": "41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"visible": true,
|
|
"startLine": 1012,
|
|
"endLine": 1015,
|
|
"parentPath": "fastapi/routing.py"
|
|
},
|
|
"23811991-d36d-4f07-8537-26065c5d3a44": {
|
|
"path": "23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"fileName": "23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"cellName": "Flow 2:\nTransmit Final\nValidation Error\nResponse",
|
|
"cellId": "23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"visible": true
|
|
},
|
|
"generated-edge-simstep-fe0f4226-4f2b-40e8-9444-b781c0208ccf-23811991-d36d-4f07-8537-26065c5d3a44": {
|
|
"path": "generated-edge-simstep-fe0f4226-4f2b-40e8-9444-b781c0208ccf-23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"fileName": "exception_handlers.py",
|
|
"cellName": "Flow 2: Transmit Final Validation Error Response",
|
|
"cellId": "23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"visible": true,
|
|
"startLine": 22,
|
|
"endLine": 25,
|
|
"parentPath": "fastapi/exception_handlers.py"
|
|
},
|
|
"f264e35a-3ede-4cd4-a4f3-5468def4eef0": {
|
|
"path": "f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"fileName": "f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"cellName": "Flow 3:\nException Triggered\nand Caught",
|
|
"cellId": "f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"visible": true,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f"
|
|
},
|
|
"generated-edge-simstep-1ae38365-5b41-4aa8-b6a4-51eac6888b15-f264e35a-3ede-4cd4-a4f3-5468def4eef0": {
|
|
"path": "generated-edge-simstep-1ae38365-5b41-4aa8-b6a4-51eac6888b15-f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"fileName": "tutorial004.py",
|
|
"cellName": "Flow 3: Exception Triggered and Caught",
|
|
"cellId": "f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"visible": true,
|
|
"startLine": 1012,
|
|
"endLine": 1015,
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
},
|
|
"f63e7186-ed41-432f-b2f3-4ede5013e529": {
|
|
"path": "f63e7186-ed41-432f-b2f3-4ede5013e529",
|
|
"fileName": "f63e7186-ed41-432f-b2f3-4ede5013e529",
|
|
"cellName": "Flow 3:\nDelegate to\nDefault Handler\n(Reuse Pattern)",
|
|
"cellId": "f63e7186-ed41-432f-b2f3-4ede5013e529",
|
|
"visible": true,
|
|
"parentCellId": "2c8af138-5b6d-4d3c-ab5f-5aebfb51515f"
|
|
},
|
|
"generated-edge-simstep-309cd2cd-9347-451f-880b-4ab7502a1b6b-f63e7186-ed41-432f-b2f3-4ede5013e529": {
|
|
"path": "generated-edge-simstep-309cd2cd-9347-451f-880b-4ab7502a1b6b-f63e7186-ed41-432f-b2f3-4ede5013e529",
|
|
"fileName": "tutorial004.py",
|
|
"cellName": "Flow 3: Delegate to Default Handler (Reuse Pattern)",
|
|
"cellId": "f63e7186-ed41-432f-b2f3-4ede5013e529",
|
|
"visible": true,
|
|
"startLine": 21,
|
|
"endLine": 21,
|
|
"parentPath": "docs_src/handling_errors/tutorial004.py"
|
|
}
|
|
},
|
|
"simulations": {
|
|
"Define API endpoints using path operation decorators": {
|
|
"name": "Define API endpoints using path operation decorators",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "ff8b011f-3cc3-4fa8-b840-55265541b8ed",
|
|
"diagramNodeId": "2b5e7ff6-1868-48b8-9702-5e22aafa2516",
|
|
"simStepLabel": "Flow 1: Define Endpoint on FastAPI App",
|
|
"simStepDescription": "A developer creates a `FastAPI` app instance and defines an endpoint by applying a path operation decorator like `@app.get(\"/\")` directly to a Python function. This decorator associates a URL path and HTTP method with the function that will handle requests.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/first_steps/tutorial001.py",
|
|
"startLine": "5",
|
|
"endLine": "9",
|
|
"relevantVariables": [
|
|
"app = FastAPI()",
|
|
"@app.get(\"/\")",
|
|
"root"
|
|
]
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{\n \"message\": \"Hello World\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "5b2746fd-6e75-4f21-949e-e9ee37f16d2d",
|
|
"diagramNodeId": "dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"simStepLabel": "Decorator Execution",
|
|
"simStepDescription": "When Python loads the module, it executes the decorator. This is a method call on the `app` instance, passing the path `/` and the HTTP method `GET` as configuration for the endpoint function `root`.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/first_steps/tutorial001.py",
|
|
"startLine": "8",
|
|
"endLine": "8",
|
|
"relevantVariables": [
|
|
"app.get"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"path\": \"/\",\n \"method\": \"GET\"\n}",
|
|
"outputDataExample": "{\n \"path\": \"/\",\n \"method\": \"GET\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "a8cc3103-1ef7-444f-90c8-59f602cdbfe2",
|
|
"diagramNodeId": "6e05ecc7-7adb-4cc0-907f-c9cd89754215",
|
|
"simStepLabel": "Route Registration",
|
|
"simStepDescription": "The `@app.get()` method call is delegated to the app's internal `APIRouter`. The router's `get()` method returns a decorator that wraps the user's function (`root`). This decorator then calls an internal method (`add_api_route`) to create an `APIRoute` object and add it to the application's central list of routes, making the endpoint live.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1877",
|
|
"endLine": "1885",
|
|
"relevantVariables": [
|
|
"app.get"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"path\": \"/\",\n \"endpoint_function\": \"root\",\n \"method\": \"GET\"\n}",
|
|
"outputDataExample": "{\n \"route_registered\": true,\n \"path\": \"/\",\n \"name\": \"root\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "d731c9cf-f665-4c13-b695-5b975262c68a",
|
|
"diagramNodeId": "e898f902-e975-496a-838f-6754c642f66b",
|
|
"simStepLabel": "Flow 2: Transition to Modular Approach",
|
|
"simStepDescription": "For better organization in larger applications, FastAPI provides `APIRouter`. This allows developers to group related endpoints in separate files, moving from decorating functions with `@app.get()` to `@router.get()` in different modules.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "667",
|
|
"endLine": "675",
|
|
"relevantVariables": [
|
|
"APIRouter"
|
|
]
|
|
},
|
|
"inputDataExample": "null",
|
|
"outputDataExample": "null"
|
|
},
|
|
{
|
|
"simStepId": "f60e1194-8deb-4b13-8401-2f7d4d59e025",
|
|
"diagramNodeId": "926aa4a2-9860-4054-a8d3-58d1bad36a26",
|
|
"simStepLabel": "Define Endpoints in a Router Module",
|
|
"simStepDescription": "A developer creates an `APIRouter` instance in a separate module (e.g., `app/routers/users.py`) and defines path operations on it using decorators like `@router.get()`. This encapsulates all user-related endpoints in one place.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/routers/users.py",
|
|
"startLine": "1",
|
|
"endLine": "11",
|
|
"relevantVariables": [
|
|
"router = APIRouter()",
|
|
"@router.get(\"/users/\", tags=[\"users\"])"
|
|
]
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{\n \"router_defined\": true,\n \"module\": \"app.routers.users\",\n \"routes\": [\n {\n \"path\": \"/users/\",\n \"method\": \"GET\",\n \"name\": \"read_users\"\n }\n ]\n}"
|
|
},
|
|
{
|
|
"simStepId": "f941cc6e-ebc5-4ebd-8b5e-fefc2ddf5f1c",
|
|
"diagramNodeId": "1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"simStepLabel": "Pass Router to Main App",
|
|
"simStepDescription": "The main application file imports the router object from the submodule and passes it to the `app.include_router()` method to incorporate its endpoints into the main application.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/main.py",
|
|
"startLine": "11",
|
|
"endLine": "11",
|
|
"relevantVariables": [
|
|
"app.include_router",
|
|
"users.router"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"router_module\": \"app.routers.users\",\n \"router_object\": \"router\"\n}",
|
|
"outputDataExample": "{\n \"router_module\": \"app.routers.users\",\n \"router_object\": \"router\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "f71efd59-5861-469f-960a-f56a9b57277d",
|
|
"diagramNodeId": "a4a492b6-cd0a-4b76-a068-6332c88f2780",
|
|
"simStepLabel": "Merge Router into Application",
|
|
"simStepDescription": "The `app.include_router()` call triggers the `FastAPI` instance to iterate through the routes defined in the provided `APIRouter`. For each route, it creates a new `APIRoute` object, applies any specified parameters like a path prefix or tags, and adds it to the main application's central router. This makes the endpoints from the sub-router available to receive requests.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1505",
|
|
"endLine": "1513",
|
|
"relevantVariables": [
|
|
"self.include_router",
|
|
"self.router.include_router"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"router\": \"<APIRouter object from users.py>\",\n \"prefix\": \"\",\n \"tags\": []\n}",
|
|
"outputDataExample": "{\n \"status\": \"Routes from users.router included in main app\"\n}"
|
|
}
|
|
],
|
|
"description": "<ul><li>The core functionality of FastAPI is creating web API endpoints</li><li>Developers use simple decorators like <code>@app</li><li>get</code>, <code>@app</li><li>post</code>, etc</li><li>, on top of standard Python functions to define the API's paths and the HTTP methods they respond to</li><li>This approach is intuitive and leverages standard Python syntax, including support for both synchronous (<code>def</code>) and asynchronous (<code>async def</code>) functions, making it easy to get started and build high-performance services</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"2b5e7ff6-1868-48b8-9702-5e22aafa2516": {
|
|
"simStepIds": [
|
|
"ff8b011f-3cc3-4fa8-b840-55265541b8ed"
|
|
]
|
|
},
|
|
"6e05ecc7-7adb-4cc0-907f-c9cd89754215": {
|
|
"simStepIds": [
|
|
"a8cc3103-1ef7-444f-90c8-59f602cdbfe2"
|
|
]
|
|
},
|
|
"926aa4a2-9860-4054-a8d3-58d1bad36a26": {
|
|
"simStepIds": [
|
|
"f60e1194-8deb-4b13-8401-2f7d4d59e025"
|
|
]
|
|
},
|
|
"a4a492b6-cd0a-4b76-a068-6332c88f2780": {
|
|
"simStepIds": [
|
|
"f71efd59-5861-469f-960a-f56a9b57277d"
|
|
]
|
|
},
|
|
"dd216165-e20a-4b31-93da-09fce6984f69": {
|
|
"simStepIds": [
|
|
"5b2746fd-6e75-4f21-949e-e9ee37f16d2d"
|
|
]
|
|
},
|
|
"e898f902-e975-496a-838f-6754c642f66b": {
|
|
"simStepIds": [
|
|
"d731c9cf-f665-4c13-b695-5b975262c68a"
|
|
]
|
|
},
|
|
"1927fc0e-1179-4fce-a035-5aea887fce02": {
|
|
"simStepIds": [
|
|
"f941cc6e-ebc5-4ebd-8b5e-fefc2ddf5f1c"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "app.get, APIRouter, @app.post",
|
|
"generationPrompt": "Define API endpoints using path operation decorators",
|
|
"generationKeywords": "app.get, APIRouter, @app.post"
|
|
},
|
|
"Automatic data validation and serialization with Python type hints": {
|
|
"name": "Automatic data validation and serialization with Python type hints",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "a7da901a-4a21-4bbc-8c8c-fc3dd6062628",
|
|
"diagramNodeId": "4bb82a78-f30e-4b1c-a69e-164917cfc206",
|
|
"simStepLabel": "Request Validation: Define Pydantic Model for Request Body",
|
|
"simStepDescription": "A developer defines a class inheriting from Pydantic's `BaseModel`. This class specifies the expected structure, data types, and validation rules for the incoming request body. FastAPI will use this model to automatically parse and validate the request payload.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/body/tutorial001.py",
|
|
"startLine": "6",
|
|
"endLine": "10",
|
|
"relevantVariables": [
|
|
"BaseModel",
|
|
"Item"
|
|
]
|
|
},
|
|
"inputDataExample": "null",
|
|
"outputDataExample": "{\"modelDefinition\": {\"name\": \"Item\", \"fields\": {\"name\": \"string\", \"description\": \"string | null\", \"price\": \"float\", \"tax\": \"float | null\"}}}"
|
|
},
|
|
{
|
|
"simStepId": "f105906a-ab10-4431-ba14-80cdbe971f2f",
|
|
"diagramNodeId": "ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"simStepLabel": "Request Validation: Link Model to Endpoint Parameter",
|
|
"simStepDescription": "The Pydantic model (`Item`) is used as a type annotation for a parameter in the path operation function. This signals to FastAPI that the `item` parameter should be populated by parsing and validating the request body according to the `Item` model's schema.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/body/tutorial001.py",
|
|
"startLine": "18",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"item: Item"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"parameter\": \"item\", \"type_hint\": \"Item\"}",
|
|
"outputDataExample": "{\"parameter\": \"item\", \"type_hint\": \"Item\"}"
|
|
},
|
|
{
|
|
"simStepId": "c3e060a2-b0b5-481f-8d4f-084ff3a7793b",
|
|
"diagramNodeId": "e3b022ed-3b88-44a1-8ece-42671ec7f9d5",
|
|
"simStepLabel": "Request Validation: Receive and Read Request Body",
|
|
"simStepDescription": "When a POST request is made to the endpoint, FastAPI's routing layer receives it. The framework then asynchronously reads the raw bytes from the incoming HTTP request body to prepare it for processing.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "328",
|
|
"endLine": "330",
|
|
"relevantVariables": [
|
|
"request.body()",
|
|
"body_bytes"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"http_request\": {\"method\": \"POST\", \"url\": \"/items/\", \"headers\": {\"Content-Type\": \"application/json\"}, \"body\": \"{\\\"name\\\": \\\"MacBook Pro\\\", \\\"price\\\": 2499.99}\"}}",
|
|
"outputDataExample": "{\"raw_body_bytes\": \"b'{\\\"name\\\": \\\"MacBook Pro\\\", \\\"price\\\": 2499.99}'\"}"
|
|
},
|
|
{
|
|
"simStepId": "4f3e5158-4d71-4281-86f9-7be02c5611cf",
|
|
"diagramNodeId": "0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"simStepLabel": "Request Validation: Pass Body for Dependency Resolution",
|
|
"simStepDescription": "The raw body, after being parsed as JSON, is passed to the dependency injection system. This system is responsible for resolving all parameters of the endpoint function, including the request body.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "379",
|
|
"endLine": "382",
|
|
"relevantVariables": [
|
|
"solve_dependencies",
|
|
"body"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"parsed_json\": {\"name\": \"MacBook Pro\", \"price\": 2499.99}}",
|
|
"outputDataExample": "{\"parsed_json\": {\"name\": \"MacBook Pro\", \"price\": 2499.99}}"
|
|
},
|
|
{
|
|
"simStepId": "8c8d65d3-8826-4fe3-af1a-67e092c3646b",
|
|
"diagramNodeId": "420c7ee9-0289-4e93-b419-d262eb649d89",
|
|
"simStepLabel": "Request Validation: Validate and Deserialize JSON Body",
|
|
"simStepDescription": "The dependency resolution logic validates the parsed JSON data against the `Item` Pydantic model. It checks for required fields, correct data types, and any other validation rules. If validation succeeds, it creates an instance of the `Item` class. If it fails, a `RequestValidationError` is raised and a 422 Unprocessable Entity response is returned.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "912",
|
|
"endLine": "914",
|
|
"relevantVariables": [
|
|
"request_body_to_args",
|
|
"body_fields",
|
|
"received_body"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"body_data\": {\"name\": \"MacBook Pro\", \"price\": 2499.99}, \"model\": \"Item\"}",
|
|
"outputDataExample": "{\"item_instance\": {\"name\": \"MacBook Pro\", \"description\": null, \"price\": 2499.99, \"tax\": null}}"
|
|
},
|
|
{
|
|
"simStepId": "fee61414-4b47-4301-a40c-841a44e11af6",
|
|
"diagramNodeId": "0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"simStepLabel": "Request Validation: Inject Model Instance into Endpoint",
|
|
"simStepDescription": "The successfully validated and instantiated `Item` object is injected as an argument into the user's path operation function, making the validated data directly accessible.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "395",
|
|
"endLine": "396",
|
|
"relevantVariables": [
|
|
"call_endpoint",
|
|
"values"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"args\": {\"item\": {\"name\": \"MacBook Pro\", \"description\": null, \"price\": 2499.99, \"tax\": null}}}",
|
|
"outputDataExample": "{\"args\": {\"item\": {\"name\": \"MacBook Pro\", \"description\": null, \"price\": 2499.99, \"tax\": null}}}"
|
|
},
|
|
{
|
|
"simStepId": "21c062b5-2a70-4c9e-aa40-e5e388d8f9a2",
|
|
"diagramNodeId": "d6492e72-b011-4de7-8256-7267f17c1ca3",
|
|
"simStepLabel": "Response Serialization: Define Input and Output Models",
|
|
"simStepDescription": "To control the output data and filter sensitive information, a developer defines separate Pydantic models for input (`UserIn`) and output (`UserOut`). The output model (`UserOut`) deliberately omits fields that should not be sent to the client, such as a user's password.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/response_model/tutorial003.py",
|
|
"startLine": "8",
|
|
"endLine": "19",
|
|
"relevantVariables": [
|
|
"UserIn",
|
|
"UserOut"
|
|
]
|
|
},
|
|
"inputDataExample": "null",
|
|
"outputDataExample": "{\"inputModel\": \"UserIn\", \"outputModel\": \"UserOut\"}"
|
|
},
|
|
{
|
|
"simStepId": "1f27ba54-996c-48d8-86d9-1decb04741c5",
|
|
"diagramNodeId": "650381df-eef9-40df-9b05-777389c18054",
|
|
"simStepLabel": "Response Serialization: Set `response_model` on Decorator",
|
|
"simStepDescription": "The `response_model` parameter in the path operation decorator is set to the output model (`UserOut`). This instructs FastAPI to use this model to serialize and filter the data returned by the endpoint function before sending the final response.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/response_model/tutorial003.py",
|
|
"startLine": "21",
|
|
"endLine": "21",
|
|
"relevantVariables": [
|
|
"app.post",
|
|
"response_model"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"path_operation\": \"/user/\", \"response_model\": \"UserOut\"}",
|
|
"outputDataExample": "{\"path_operation\": \"/user/\", \"response_model\": \"UserOut\"}"
|
|
},
|
|
{
|
|
"simStepId": "41999094-9985-422a-85cb-4be9a109d7c6",
|
|
"diagramNodeId": "bd740fd1-a54f-4634-81fc-78b0ed1642ad",
|
|
"simStepLabel": "Response Serialization: Return Data from Endpoint",
|
|
"simStepDescription": "The endpoint function executes its logic and returns data. This data can be a dictionary or, in this case, an instance of the `UserIn` model, which includes the sensitive `password` field.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/response_model/tutorial003.py",
|
|
"startLine": "22",
|
|
"endLine": "23",
|
|
"relevantVariables": [
|
|
"user_in"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"user_in\": {\"username\": \"john.doe\", \"password\": \"a_very_secret_password\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}",
|
|
"outputDataExample": "{\"raw_return_value\": {\"username\": \"john.doe\", \"password\": \"a_very_secret_password\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}"
|
|
},
|
|
{
|
|
"simStepId": "ef20d7e6-e76e-461a-8dbb-4d184eb2c685",
|
|
"diagramNodeId": "284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"simStepLabel": "Response Serialization: Pass Return Value for Serialization",
|
|
"simStepDescription": "The raw data object returned by the endpoint function is passed to FastAPI's internal response handling layer to be processed according to the `response_model`.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "395",
|
|
"endLine": "396",
|
|
"relevantVariables": [
|
|
"raw_response",
|
|
"call_endpoint"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"raw_response\": {\"username\": \"john.doe\", \"password\": \"a_very_secret_password\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}",
|
|
"outputDataExample": "{\"raw_response\": {\"username\": \"john.doe\", \"password\": \"a_very_secret_password\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}"
|
|
},
|
|
{
|
|
"simStepId": "e717de6c-aa13-4478-9d04-b1502a58bb10",
|
|
"diagramNodeId": "4d193d20-5a44-4123-894a-3ee686cdc355",
|
|
"simStepLabel": "Response Serialization: Serialize and Filter Response Data",
|
|
"simStepDescription": "FastAPI uses the specified `response_model` (`UserOut`) to serialize the returned data. It creates a new dictionary containing only the fields defined in `UserOut`, effectively filtering out the `password` field. If the returned data is incompatible with the response model, a `ResponseValidationError` is raised.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "411",
|
|
"endLine": "417",
|
|
"relevantVariables": [
|
|
"serialize_response",
|
|
"response_field",
|
|
"response_model_include",
|
|
"response_model_exclude"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"data_to_serialize\": {\"username\": \"john.doe\", \"password\": \"a_very_secret_password\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}, \"schema\": \"UserOut\"}",
|
|
"outputDataExample": "{\"serialized_data\": {\"username\": \"john.doe\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}"
|
|
},
|
|
{
|
|
"simStepId": "581f7326-f768-4485-bd29-ee0455472a8a",
|
|
"diagramNodeId": "",
|
|
"simStepLabel": "Response Serialization: Transmit Final JSON Response",
|
|
"simStepDescription": "The filtered and serialized data is packaged into a `JSONResponse` object and sent back to the client. The final HTTP response body contains only the fields specified in the `UserOut` model.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "418",
|
|
"endLine": "420",
|
|
"relevantVariables": [
|
|
"response_class",
|
|
"response_content"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"json_payload\": {\"username\": \"john.doe\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}",
|
|
"outputDataExample": "{\"json_payload\": {\"username\": \"john.doe\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\"}}"
|
|
}
|
|
],
|
|
"description": "<ul><li>A key feature of FastAPI is its deep integration with Pydantic for robust data handling</li><li>Developers define the expected structure of request and response data using Pydantic's <code>BaseModel</code> and Python type hints</li><li>FastAPI then automatically parses and validates incoming request bodies against these models, returning detailed, user-friendly errors for any mismatches</li><li>It also serializes outgoing data into JSON, ensuring the API's responses conform to the defined schema</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"4bb82a78-f30e-4b1c-a69e-164917cfc206": {
|
|
"simStepIds": [
|
|
"a7da901a-4a21-4bbc-8c8c-fc3dd6062628"
|
|
]
|
|
},
|
|
"e3b022ed-3b88-44a1-8ece-42671ec7f9d5": {
|
|
"simStepIds": [
|
|
"c3e060a2-b0b5-481f-8d4f-084ff3a7793b"
|
|
]
|
|
},
|
|
"420c7ee9-0289-4e93-b419-d262eb649d89": {
|
|
"simStepIds": [
|
|
"8c8d65d3-8826-4fe3-af1a-67e092c3646b"
|
|
]
|
|
},
|
|
"d6492e72-b011-4de7-8256-7267f17c1ca3": {
|
|
"simStepIds": [
|
|
"21c062b5-2a70-4c9e-aa40-e5e388d8f9a2"
|
|
]
|
|
},
|
|
"bd740fd1-a54f-4634-81fc-78b0ed1642ad": {
|
|
"simStepIds": [
|
|
"41999094-9985-422a-85cb-4be9a109d7c6"
|
|
]
|
|
},
|
|
"4d193d20-5a44-4123-894a-3ee686cdc355": {
|
|
"simStepIds": [
|
|
"e717de6c-aa13-4478-9d04-b1502a58bb10"
|
|
]
|
|
},
|
|
"ae365bbc-07ba-4f1e-8f09-c7aff7137d26": {
|
|
"simStepIds": [
|
|
"f105906a-ab10-4431-ba14-80cdbe971f2f"
|
|
]
|
|
},
|
|
"0eb5062e-0f9b-4eb4-b99e-3de4035a25a2": {
|
|
"simStepIds": [
|
|
"4f3e5158-4d71-4281-86f9-7be02c5611cf"
|
|
]
|
|
},
|
|
"0ff0716f-03dd-4960-ab7c-76b74559d1f3": {
|
|
"simStepIds": [
|
|
"fee61414-4b47-4301-a40c-841a44e11af6"
|
|
]
|
|
},
|
|
"650381df-eef9-40df-9b05-777389c18054": {
|
|
"simStepIds": [
|
|
"1f27ba54-996c-48d8-86d9-1decb04741c5"
|
|
]
|
|
},
|
|
"284b60e3-6fbd-4780-b433-8fc0fe8c7e28": {
|
|
"simStepIds": [
|
|
"ef20d7e6-e76e-461a-8dbb-4d184eb2c685"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "BaseModel, response_model, Body",
|
|
"generationPrompt": "Automatic data validation and serialization with Python type hints",
|
|
"generationKeywords": "BaseModel, response_model, Body"
|
|
},
|
|
"Automatically generate interactive API documentation": {
|
|
"name": "Automatically generate interactive API documentation",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "62559c5d-7c59-49cb-8dc0-eaded773a2c0",
|
|
"diagramNodeId": "e4a59297-1264-44a9-898c-4dee94711ce9",
|
|
"simStepLabel": "Swagger Docs Flow: Receive Request for Swagger UI",
|
|
"simStepDescription": "When a FastAPI application starts, it sets up default routes for API documentation. When a user navigates to `/docs`, the corresponding route handler `swagger_ui_html` is triggered to serve the documentation page.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1094",
|
|
"endLine": "1101",
|
|
"relevantVariables": [
|
|
"swagger_ui_html",
|
|
"req",
|
|
"get_swagger_ui_html"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/docs\", \"headers\": {\"Accept\": \"text/html\"}}",
|
|
"outputDataExample": "{\"status_code\": 200, \"content_type\": \"text/html\"}"
|
|
},
|
|
{
|
|
"simStepId": "198b9c8f-91a9-4bd8-81cd-9baf58501924",
|
|
"diagramNodeId": "c09eca71-295a-433a-ab27-2870cb096176",
|
|
"simStepLabel": "Swagger Docs Flow: Call HTML Generation Utility",
|
|
"simStepDescription": "The route handler for `/docs` calls the `get_swagger_ui_html` utility function. It passes necessary parameters like the `openapi_url`, the application title, and OAuth2 redirect URL to construct the HTML page.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1097",
|
|
"endLine": "1100",
|
|
"relevantVariables": [
|
|
"get_swagger_ui_html"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_url\": \"/openapi.json\", \"title\": \"FastAPI - Swagger UI\", \"swagger_ui_parameters\": {\"dom_id\": \"#swagger-ui\"}}",
|
|
"outputDataExample": "{\"openapi_url\": \"/openapi.json\", \"title\": \"FastAPI - Swagger UI\", \"swagger_ui_parameters\": {\"dom_id\": \"#swagger-ui\"}}"
|
|
},
|
|
{
|
|
"simStepId": "03f94017-eaa6-4187-94c1-cfa9035fad87",
|
|
"diagramNodeId": "b71f1299-bb58-4dbf-af94-bfaf6109a6b6",
|
|
"simStepLabel": "Swagger Docs Flow: Generate Swagger UI HTML Page",
|
|
"simStepDescription": "The `get_swagger_ui_html` function constructs a complete HTML document. This document includes links to Swagger UI's CSS and JavaScript assets (typically from a CDN) and contains an embedded script that initializes Swagger UI, instructing it to fetch the API schema from the `openapi_url`.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/docs.py",
|
|
"startLine": "42",
|
|
"endLine": "159",
|
|
"relevantVariables": [
|
|
"get_swagger_ui_html",
|
|
"html",
|
|
"openapi_url",
|
|
"swagger_js_url",
|
|
"swagger_css_url"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_url\": \"/openapi.json\", \"title\": \"FastAPI - Swagger UI\"}",
|
|
"outputDataExample": "{\"http_response_body\": \"<!DOCTYPE html><html><head>...</head><body><div id=\\\"swagger-ui\\\"></div><script>...SwaggerUIBundle({ url: '/openapi.json' ...})</script></body></html>\"}"
|
|
},
|
|
{
|
|
"simStepId": "271f8b55-4ca5-45eb-bcbd-200744683192",
|
|
"diagramNodeId": "8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"simStepLabel": "Swagger Docs Flow: Browser Receives HTML and Requests Schema",
|
|
"simStepDescription": "The generated HTML page is sent to the browser. The browser then renders the page and executes the embedded JavaScript, which triggers a new GET request to the path specified in `openapi_url` (by default, `/openapi.json`) to fetch the API schema.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/docs.py",
|
|
"startLine": "133",
|
|
"endLine": "133",
|
|
"relevantVariables": [
|
|
"url: '{openapi_url}'"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request_to_server\": {\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/openapi.json\"}}",
|
|
"outputDataExample": "{\"request_to_server\": {\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/openapi.json\"}}"
|
|
},
|
|
{
|
|
"simStepId": "3e7e3cf7-4f11-4281-9883-665713027cca",
|
|
"diagramNodeId": "40a4dbed-c500-4e10-8576-a6a3c6e89f42",
|
|
"simStepLabel": "Shared Flow: Generate OpenAPI Schema",
|
|
"simStepDescription": "The request to `/openapi.json` is handled by the `openapi` method of the FastAPI app. If the schema is not already cached, this method calls the `get_openapi` utility to generate it by introspecting the application's routes, Pydantic models, dependencies, and other metadata.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1054",
|
|
"endLine": "1079",
|
|
"relevantVariables": [
|
|
"openapi",
|
|
"self.openapi_schema",
|
|
"get_openapi"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/openapi.json\"}",
|
|
"outputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {...}, \"paths\": {...}}}"
|
|
},
|
|
{
|
|
"simStepId": "2382096f-c702-4b0e-8e88-3388794ce7cd",
|
|
"diagramNodeId": "8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"simStepLabel": "Shared Flow: Transmit Generated Schema",
|
|
"simStepDescription": "The `get_openapi` function returns the generated schema as a Python dictionary. The route handler then serializes this dictionary into a JSON response and sends it back to the browser.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/utils.py",
|
|
"startLine": "477",
|
|
"endLine": "558",
|
|
"relevantVariables": [
|
|
"get_openapi",
|
|
"get_openapi_path"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {\"title\": \"My API\", \"version\": \"1.0\"}, \"paths\": {\"/items/\": {\"get\": {\"summary\": \"Read Items\"}}}}}",
|
|
"outputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {\"title\": \"My API\", \"version\": \"1.0\"}, \"paths\": {\"/items/\": {\"get\": {\"summary\": \"Read Items\"}}}}}"
|
|
},
|
|
{
|
|
"simStepId": "eceee8d4-49f5-4b41-9200-83ccec2c84e7",
|
|
"diagramNodeId": "29279a4a-6028-4d0a-8e6e-5df871526243",
|
|
"simStepLabel": "Swagger Docs Flow: Render Interactive UI",
|
|
"simStepDescription": "The Swagger UI JavaScript running in the browser receives the OpenAPI schema as JSON. It then parses this data to dynamically render the complete, interactive API documentation, including all endpoints, parameters, and schemas.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/docs.py",
|
|
"startLine": "132",
|
|
"endLine": "136",
|
|
"relevantVariables": [
|
|
"SwaggerUIBundle"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {\"title\": \"My API\"}, \"paths\": {\"/items/\": {\"get\": {}}}}}",
|
|
"outputDataExample": "{\"ui_state\": \"Fully rendered interactive documentation with endpoints listed\"}"
|
|
},
|
|
{
|
|
"simStepId": "aaedfecc-bfc7-4d9e-82ca-6c437c8d572e",
|
|
"diagramNodeId": "b7f04727-ddee-4e7f-aa93-9b248246cb43",
|
|
"simStepLabel": "ReDoc Flow: Receive Request for ReDoc UI",
|
|
"simStepDescription": "Alternatively, a user can navigate to `/redoc`. The corresponding route handler `redoc_html`, defined during application setup, is triggered to serve the ReDoc documentation page.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1117",
|
|
"endLine": "1123",
|
|
"relevantVariables": [
|
|
"redoc_html",
|
|
"req",
|
|
"get_redoc_html"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/redoc\", \"headers\": {\"Accept\": \"text/html\"}}",
|
|
"outputDataExample": "{\"status_code\": 200, \"content_type\": \"text/html\"}"
|
|
},
|
|
{
|
|
"simStepId": "f949b2f6-b33e-48ff-86d9-3f1889c775a4",
|
|
"diagramNodeId": "d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"simStepLabel": "ReDoc Flow: Call HTML Generation Utility",
|
|
"simStepDescription": "The `redoc_html` route handler calls the `get_redoc_html` utility function, passing parameters such as the `openapi_url` and application title to construct the HTML page.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1120",
|
|
"endLine": "1122",
|
|
"relevantVariables": [
|
|
"get_redoc_html"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_url\": \"/openapi.json\", \"title\": \"FastAPI - ReDoc\"}",
|
|
"outputDataExample": "{\"openapi_url\": \"/openapi.json\", \"title\": \"FastAPI - ReDoc\"}"
|
|
},
|
|
{
|
|
"simStepId": "8aea22f4-b50d-4473-8c0c-fc36c9674074",
|
|
"diagramNodeId": "2709025c-1969-4906-a148-18d287b5aac5",
|
|
"simStepLabel": "ReDoc Flow: Generate ReDoc HTML Page",
|
|
"simStepDescription": "The `get_redoc_html` function constructs a complete HTML document. This document includes a link to the ReDoc JavaScript bundle (from a CDN) and uses a `<redoc>` custom HTML tag with the `spec-url` attribute set to the `openapi_url`.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/docs.py",
|
|
"startLine": "161",
|
|
"endLine": "254",
|
|
"relevantVariables": [
|
|
"get_redoc_html",
|
|
"html",
|
|
"openapi_url",
|
|
"redoc_js_url"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_url\": \"/openapi.json\", \"title\": \"FastAPI - ReDoc\"}",
|
|
"outputDataExample": "{\"http_response_body\": \"<!DOCTYPE html><html><head>...</head><body><redoc spec-url='/openapi.json'></redoc><script src='...'></script></body></html>\"}"
|
|
},
|
|
{
|
|
"simStepId": "24ee0db5-8733-4165-9745-8de2709d88f5",
|
|
"diagramNodeId": "d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"simStepLabel": "ReDoc Flow: Browser Receives HTML and Requests Schema",
|
|
"simStepDescription": "The generated HTML page is sent to the browser. The browser then renders the page, and the ReDoc JavaScript fetches the API schema from the URL specified in the `spec-url` attribute of the `<redoc>` tag (by default, `/openapi.json`).",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/docs.py",
|
|
"startLine": "249",
|
|
"endLine": "249",
|
|
"relevantVariables": [
|
|
"spec-url=\"{openapi_url}\""
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request_to_server\": {\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/openapi.json\"}}",
|
|
"outputDataExample": "{\"request_to_server\": {\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/openapi.json\"}}"
|
|
},
|
|
{
|
|
"simStepId": "faadf711-1fbb-4fc3-bef7-79a08dfdb574",
|
|
"diagramNodeId": "a0ec126e-9261-47be-8bfd-46fe40ae350d",
|
|
"simStepLabel": "Shared Flow: Generate OpenAPI Schema",
|
|
"simStepDescription": "The request to `/openapi.json` is handled by the `openapi` method of the FastAPI app. If the schema is not already cached, this method calls the `get_openapi` utility to generate it by introspecting the application's routes, Pydantic models, dependencies, and other metadata. (This step is shared with the Swagger UI flow).",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1054",
|
|
"endLine": "1079",
|
|
"relevantVariables": [
|
|
"openapi",
|
|
"self.openapi_schema",
|
|
"get_openapi"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"http://127.0.0.1:8000/openapi.json\"}",
|
|
"outputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {...}, \"paths\": {...}}}"
|
|
},
|
|
{
|
|
"simStepId": "54e37b0b-a5bd-4888-a766-a79e7bf60135",
|
|
"diagramNodeId": "ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"simStepLabel": "Shared Flow: Transmit Generated Schema",
|
|
"simStepDescription": "The generated schema dictionary is serialized into a JSON response and sent back to the browser. (This step is shared with the Swagger UI flow).",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/utils.py",
|
|
"startLine": "477",
|
|
"endLine": "558",
|
|
"relevantVariables": [
|
|
"get_openapi",
|
|
"get_openapi_path"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {\"title\": \"My API\", \"version\": \"1.0\"}, \"paths\": {\"/items/\": {\"get\": {\"summary\": \"Read Items\"}}}}}",
|
|
"outputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {\"title\": \"My API\", \"version\": \"1.0\"}, \"paths\": {\"/items/\": {\"get\": {\"summary\": \"Read Items\"}}}}}"
|
|
},
|
|
{
|
|
"simStepId": "8cc0da97-9556-453f-bebd-835b2d04164c",
|
|
"diagramNodeId": "c06cc146-1404-4651-9d20-e9bdb7a4cd50",
|
|
"simStepLabel": "ReDoc Flow: Render Static Documentation",
|
|
"simStepDescription": "The ReDoc JavaScript running in the browser receives the OpenAPI schema as JSON. It then parses this data to dynamically render the static, three-panel API documentation page.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/openapi/docs.py",
|
|
"startLine": "249",
|
|
"endLine": "250",
|
|
"relevantVariables": [
|
|
"redoc",
|
|
"redoc_js_url"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"openapi_schema\": {\"openapi\": \"3.1.0\", \"info\": {\"title\": \"My API\"}, \"paths\": {\"/items/\": {\"get\": {}}}}}",
|
|
"outputDataExample": "{\"ui_state\": \"Fully rendered static documentation with endpoints listed\"}"
|
|
}
|
|
],
|
|
"description": "<ul><li>FastAPI automatically generates a machine-readable OpenAPI schema from the codebase, including paths, parameters, request bodies, and security requirements</li><li>This schema is then used to power two interactive API documentation interfaces, Swagger UI (available at <code>/docs</code>) and ReDoc (at <code>/redoc</code>), which are included by default</li><li>This feature allows developers and API consumers to explore, test, and understand the API directly in a browser, significantly reducing documentation effort and improving usability</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"e4a59297-1264-44a9-898c-4dee94711ce9": {
|
|
"simStepIds": [
|
|
"62559c5d-7c59-49cb-8dc0-eaded773a2c0"
|
|
]
|
|
},
|
|
"b71f1299-bb58-4dbf-af94-bfaf6109a6b6": {
|
|
"simStepIds": [
|
|
"03f94017-eaa6-4187-94c1-cfa9035fad87"
|
|
]
|
|
},
|
|
"40a4dbed-c500-4e10-8576-a6a3c6e89f42": {
|
|
"simStepIds": [
|
|
"3e7e3cf7-4f11-4281-9883-665713027cca"
|
|
]
|
|
},
|
|
"29279a4a-6028-4d0a-8e6e-5df871526243": {
|
|
"simStepIds": [
|
|
"eceee8d4-49f5-4b41-9200-83ccec2c84e7"
|
|
]
|
|
},
|
|
"b7f04727-ddee-4e7f-aa93-9b248246cb43": {
|
|
"simStepIds": [
|
|
"aaedfecc-bfc7-4d9e-82ca-6c437c8d572e"
|
|
]
|
|
},
|
|
"2709025c-1969-4906-a148-18d287b5aac5": {
|
|
"simStepIds": [
|
|
"8aea22f4-b50d-4473-8c0c-fc36c9674074"
|
|
]
|
|
},
|
|
"a0ec126e-9261-47be-8bfd-46fe40ae350d": {
|
|
"simStepIds": [
|
|
"faadf711-1fbb-4fc3-bef7-79a08dfdb574"
|
|
]
|
|
},
|
|
"c06cc146-1404-4651-9d20-e9bdb7a4cd50": {
|
|
"simStepIds": [
|
|
"8cc0da97-9556-453f-bebd-835b2d04164c"
|
|
]
|
|
},
|
|
"c09eca71-295a-433a-ab27-2870cb096176": {
|
|
"simStepIds": [
|
|
"198b9c8f-91a9-4bd8-81cd-9baf58501924"
|
|
]
|
|
},
|
|
"8c03ffed-641c-4edb-86fd-8373f4400b75": {
|
|
"simStepIds": [
|
|
"271f8b55-4ca5-45eb-bcbd-200744683192"
|
|
]
|
|
},
|
|
"8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89": {
|
|
"simStepIds": [
|
|
"2382096f-c702-4b0e-8e88-3388794ce7cd"
|
|
]
|
|
},
|
|
"d645b274-e798-4677-8ecd-0cfb23b2989c": {
|
|
"simStepIds": [
|
|
"f949b2f6-b33e-48ff-86d9-3f1889c775a4"
|
|
]
|
|
},
|
|
"d145150d-7f0b-4c3e-a048-b16f23cb5c9b": {
|
|
"simStepIds": [
|
|
"24ee0db5-8733-4165-9745-8de2709d88f5"
|
|
]
|
|
},
|
|
"ee6a230a-6885-436e-9530-d36c032b611b": {
|
|
"simStepIds": [
|
|
"54e37b0b-a5bd-4888-a766-a79e7bf60135"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "get_openapi, swagger-ui, redoc",
|
|
"generationPrompt": "Automatically generate interactive API documentation",
|
|
"generationKeywords": "get_openapi, swagger-ui, redoc"
|
|
},
|
|
"Manage dependencies and shared logic with a powerful injection system": {
|
|
"name": "Manage dependencies and shared logic with a powerful injection system",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "6a06bcaa-1a73-4541-ac3a-ea66a2e77123",
|
|
"diagramNodeId": "f6bb6d10-45ca-4e81-871f-780dea9a7305",
|
|
"simStepLabel": "Application Initialization",
|
|
"simStepDescription": "A FastAPI application is instantiated. During initialization, an empty dictionary `dependency_overrides` is created to hold any future dependency overrides. This dictionary is central to swapping out dependencies, typically for testing purposes.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "945",
|
|
"endLine": "953",
|
|
"relevantVariables": [
|
|
"self.dependency_overrides"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"title\": \"My Awesome API\",\n \"version\": \"1.0.0\"\n}",
|
|
"outputDataExample": "{\n \"app\": \"<FastAPI object>\",\n \"dependency_overrides\": {}\n}"
|
|
},
|
|
{
|
|
"simStepId": "8496aba1-ac04-49e4-8393-bbfbc6b21a3f",
|
|
"diagramNodeId": "6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"simStepLabel": "Router Initialization",
|
|
"simStepDescription": "The `FastAPI` instance creates its main `APIRouter`. The app instance itself is passed to the router as the `dependency_overrides_provider`, making the `dependency_overrides` dictionary accessible to the routing layer.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "962",
|
|
"endLine": "969",
|
|
"relevantVariables": [
|
|
"routing.APIRouter",
|
|
"dependency_overrides_provider=self"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"dependency_overrides_provider\": \"<FastAPI app instance>\"\n}",
|
|
"outputDataExample": "{\n \"dependency_overrides_provider\": \"<FastAPI app instance>\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "ed7142a9-d68b-4eff-882c-b64a5458d833",
|
|
"diagramNodeId": "ffe256a7-70ab-40e0-b789-c9b6baaae7c3",
|
|
"simStepLabel": "Route and Dependency Analysis",
|
|
"simStepDescription": "When a path operation (e.g., `@app.get('/items/')`) is added, FastAPI analyzes its signature. If a parameter uses `Depends`, the `get_dependant` utility is called to parse the endpoint, identify the dependency, and create a `Dependant` object that models its requirements.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "629",
|
|
"endLine": "629",
|
|
"relevantVariables": [
|
|
"self.dependant",
|
|
"get_dependant"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"path\": \"/items/\",\n \"endpoint\": \"<function read_items at 0x10e8b3e20>\",\n \"parameter\": \"commons: dict = Depends(common_parameters)\"\n}",
|
|
"outputDataExample": "{\n \"dependant\": \"<Dependant object for read_items>\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "648bda8a-8ce0-4133-b872-b36a5c307222",
|
|
"diagramNodeId": "b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"simStepLabel": "Dependency Information Propagation",
|
|
"simStepDescription": "During the analysis within `get_dependant`, each parameter of the dependency callable is inspected by `analyze_param`. This function identifies the `Depends` marker and extracts the dependency function, building a detailed model of the dependency graph.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "409",
|
|
"endLine": "415",
|
|
"relevantVariables": [
|
|
"analyze_param",
|
|
"params.Depends",
|
|
"depends"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"param_name\": \"commons\",\n \"annotation\": \"dict\",\n \"default_value\": \"Depends(common_parameters)\"\n}",
|
|
"outputDataExample": "{\n \"param_name\": \"commons\",\n \"annotation\": \"dict\",\n \"default_value\": \"Depends(common_parameters)\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "76b5449b-696e-4772-842a-e175d6ecfb48",
|
|
"diagramNodeId": "e72088ee-22e5-4463-b5ff-1eaafe569f93",
|
|
"simStepLabel": "Registering a Dependency Override",
|
|
"simStepDescription": "For testing or other scenarios, a dependency can be overridden by adding an entry to the `app.dependency_overrides` dictionary. The key is the original dependency callable, and the value is the new callable that should be executed instead.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/dependency_testing/tutorial001.py",
|
|
"startLine": "31",
|
|
"endLine": "31",
|
|
"relevantVariables": [
|
|
"app.dependency_overrides",
|
|
"common_parameters",
|
|
"override_dependency"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"original_dependency\": \"<function common_parameters>\",\n \"override_dependency\": \"<function override_dependency>\"\n}",
|
|
"outputDataExample": "{\n \"app.dependency_overrides\": {\n \"<function common_parameters>\": \"<function override_dependency>\"\n }\n}"
|
|
},
|
|
{
|
|
"simStepId": "cdd1be57-2fde-40a2-8b73-144a7dd9fa25",
|
|
"diagramNodeId": "382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"simStepLabel": "Request to Route Handler",
|
|
"simStepDescription": "An incoming HTTP request is matched to a route. The route's handler prepares to execute, which involves resolving any dependencies associated with the endpoint.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "667",
|
|
"endLine": "667",
|
|
"relevantVariables": [
|
|
"self.app(request)"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"method\": \"GET\",\n \"url\": \"/items/\"\n}",
|
|
"outputDataExample": "{\n \"method\": \"GET\",\n \"url\": \"/items/\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "05d78d9d-f843-4424-a0df-4114cd1d9542",
|
|
"diagramNodeId": "7311e683-4633-41fe-94d6-cd7f59f20fc0",
|
|
"simStepLabel": "Initiating Dependency Resolution",
|
|
"simStepDescription": "The route handler calls `solve_dependencies`. This is the core function that orchestrates the resolution of the entire dependency graph for the request, including handling any overrides.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "377",
|
|
"endLine": "384",
|
|
"relevantVariables": [
|
|
"solve_dependencies",
|
|
"dependant",
|
|
"dependency_overrides_provider"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"request\": \"<Request object>\",\n \"dependant\": \"<Dependant object for read_items>\",\n \"dependency_overrides_provider\": \"<FastAPI app instance>\"\n}",
|
|
"outputDataExample": "{\n \"solved_result\": \"<SolvedDependency object>\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "f60a0dd4-d561-4be6-bc24-801785c90f57",
|
|
"diagramNodeId": "12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"simStepLabel": "Passing Overrides to `solve_dependencies`",
|
|
"simStepDescription": "The `dependency_overrides_provider` (the app instance) and its `dependency_overrides` dictionary are passed down into the `solve_dependencies` function. This makes the registered overrides available for the resolution logic.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "380",
|
|
"endLine": "380",
|
|
"relevantVariables": [
|
|
"dependency_overrides_provider"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"dependency_overrides_provider\": {\n \"dependency_overrides\": {\n \"<function common_parameters>\": \"<function override_dependency>\"\n }\n }\n}",
|
|
"outputDataExample": "{\n \"dependency_overrides_provider\": {\n \"dependency_overrides\": {\n \"<function common_parameters>\": \"<function override_dependency>\"\n }\n }\n}"
|
|
},
|
|
{
|
|
"simStepId": "f92f840f-e67d-4895-83e5-aea8cb53a6ad",
|
|
"diagramNodeId": "90cec20b-7186-481b-9fc1-827b0f9b4c3d",
|
|
"simStepLabel": "Checking for an Override",
|
|
"simStepDescription": "Inside `solve_dependencies`, for each dependency being resolved, the system checks if the original dependency function exists as a key in the `dependency_overrides` dictionary.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "607",
|
|
"endLine": "610",
|
|
"relevantVariables": [
|
|
"dependency_overrides_provider",
|
|
"dependency_overrides_provider.dependency_overrides"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"sub_dependant.call\": \"<function common_parameters>\",\n \"dependency_overrides\": {\n \"<function common_parameters>\": \"<function override_dependency>\"\n }\n}",
|
|
"outputDataExample": "{\n \"found_override\": true,\n \"override_callable\": \"<function override_dependency>\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "59a5196a-fa0f-4e56-9631-e5e28f624c80",
|
|
"diagramNodeId": "a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"simStepLabel": "Switching to Override Callable",
|
|
"simStepDescription": "If an override is found, the `call` variable, which holds the function to be executed, is updated from the original dependency to the override function. A new `Dependant` object is also created for the override function to correctly resolve its own parameters.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "611",
|
|
"endLine": "621",
|
|
"relevantVariables": [
|
|
"original_call",
|
|
"call",
|
|
"get_dependant",
|
|
"use_sub_dependant"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"original_call\": \"<function common_parameters>\",\n \"override_call\": \"<function override_dependency>\"\n}",
|
|
"outputDataExample": "{\n \"original_call\": \"<function common_parameters>\",\n \"override_call\": \"<function override_dependency>\"\n}"
|
|
},
|
|
{
|
|
"simStepId": "16e2c7a7-9f7c-49d3-be77-e2a2a4915fe6",
|
|
"diagramNodeId": "1dcbd706-7009-42e5-81ad-8e2fea59e6a5",
|
|
"simStepLabel": "Executing the Override Dependency",
|
|
"simStepDescription": "The `solve_dependencies` function is called recursively, this time to process the new `Dependant` object created for the override function. This resolves the parameters of the override function and executes it.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "625",
|
|
"endLine": "634",
|
|
"relevantVariables": [
|
|
"solve_dependencies",
|
|
"use_sub_dependant",
|
|
"solved_result"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"request\": \"<Request object>\",\n \"dependant\": \"<Dependant object for override_dependency>\"\n}",
|
|
"outputDataExample": "{\n \"values\": {},\n \"errors\": [],\n \"background_tasks\": null,\n \"response\": null,\n \"dependency_cache\": {\n \"(<function override_dependency>, ())\": {\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n }\n }\n}"
|
|
},
|
|
{
|
|
"simStepId": "c6e7c7e5-cc9a-4497-9c35-1d4df1a06057",
|
|
"diagramNodeId": "997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"simStepLabel": "Returning Resolved Override Value",
|
|
"simStepDescription": "The value returned by the executed override dependency (`{'q': null, 'skip': 5, 'limit': 10}`) is passed back up the call stack to be used in the original path operation function.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "591",
|
|
"endLine": "591",
|
|
"relevantVariables": [
|
|
"SolvedDependency"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n}",
|
|
"outputDataExample": "{\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n}"
|
|
},
|
|
{
|
|
"simStepId": "104b9697-bfcb-4d7f-b645-f3d12fe39444",
|
|
"diagramNodeId": "149c1867-ad1b-4774-97a5-51df12cae15c",
|
|
"simStepLabel": "Injecting Value into Endpoint",
|
|
"simStepDescription": "FastAPI calls the main endpoint function (`read_items`), injecting the result from the overridden dependency as the value for the `commons` parameter.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "389",
|
|
"endLine": "389",
|
|
"relevantVariables": [
|
|
"dependant.call",
|
|
"values"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"endpoint\": \"<function read_items>\",\n \"injected_args\": {\n \"commons\": {\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n }\n }\n}",
|
|
"outputDataExample": "{\n \"message\": \"Hello Items!\",\n \"params\": {\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n }\n}"
|
|
},
|
|
{
|
|
"simStepId": "ef52eed7-0c90-4643-93fd-da98e139372f",
|
|
"diagramNodeId": "",
|
|
"simStepLabel": "Final Response to Client",
|
|
"simStepDescription": "The return value from the endpoint function is serialized into a JSON response and sent back to the client, completing the request-response cycle.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "400",
|
|
"endLine": "400",
|
|
"relevantVariables": [
|
|
"response_class",
|
|
"response_data"
|
|
]
|
|
},
|
|
"inputDataExample": "{\n \"message\": \"Hello Items!\",\n \"params\": {\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n }\n}",
|
|
"outputDataExample": "{\n \"message\": \"Hello Items!\",\n \"params\": {\n \"q\": null,\n \"skip\": 5,\n \"limit\": 10\n }\n}"
|
|
}
|
|
],
|
|
"description": "<ul><li>FastAPI includes a simple yet powerful dependency injection system</li><li>By using the <code>Depends</code> marker on path operation parameters, developers can declare dependencies like database connections, authentication logic, or reusable parameter validation</li><li>FastAPI manages the resolution of these dependencies, caches results within a single request, and makes them available to the endpoint</li><li>This system is crucial for writing clean, reusable, and easily testable code, especially for complex applications</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"f6bb6d10-45ca-4e81-871f-780dea9a7305": {
|
|
"simStepIds": [
|
|
"6a06bcaa-1a73-4541-ac3a-ea66a2e77123"
|
|
]
|
|
},
|
|
"ffe256a7-70ab-40e0-b789-c9b6baaae7c3": {
|
|
"simStepIds": [
|
|
"ed7142a9-d68b-4eff-882c-b64a5458d833"
|
|
]
|
|
},
|
|
"e72088ee-22e5-4463-b5ff-1eaafe569f93": {
|
|
"simStepIds": [
|
|
"76b5449b-696e-4772-842a-e175d6ecfb48"
|
|
]
|
|
},
|
|
"7311e683-4633-41fe-94d6-cd7f59f20fc0": {
|
|
"simStepIds": [
|
|
"05d78d9d-f843-4424-a0df-4114cd1d9542"
|
|
]
|
|
},
|
|
"90cec20b-7186-481b-9fc1-827b0f9b4c3d": {
|
|
"simStepIds": [
|
|
"f92f840f-e67d-4895-83e5-aea8cb53a6ad"
|
|
]
|
|
},
|
|
"1dcbd706-7009-42e5-81ad-8e2fea59e6a5": {
|
|
"simStepIds": [
|
|
"16e2c7a7-9f7c-49d3-be77-e2a2a4915fe6"
|
|
]
|
|
},
|
|
"149c1867-ad1b-4774-97a5-51df12cae15c": {
|
|
"simStepIds": [
|
|
"104b9697-bfcb-4d7f-b645-f3d12fe39444"
|
|
]
|
|
},
|
|
"6f79803c-d6f1-4835-840a-8a90f70c549a": {
|
|
"simStepIds": [
|
|
"8496aba1-ac04-49e4-8393-bbfbc6b21a3f"
|
|
]
|
|
},
|
|
"b6ef964f-2f6b-4548-96a8-c41ea9119862": {
|
|
"simStepIds": [
|
|
"648bda8a-8ce0-4133-b872-b36a5c307222"
|
|
]
|
|
},
|
|
"382e0121-cd55-4d6e-be07-8107e3074955": {
|
|
"simStepIds": [
|
|
"cdd1be57-2fde-40a2-8b73-144a7dd9fa25"
|
|
]
|
|
},
|
|
"12b15e5e-0779-4c86-8f9b-ea73346f85ac": {
|
|
"simStepIds": [
|
|
"f60a0dd4-d561-4be6-bc24-801785c90f57"
|
|
]
|
|
},
|
|
"a53196c6-51c7-4ad4-853c-6dddb4c94ed3": {
|
|
"simStepIds": [
|
|
"59a5196a-fa0f-4e56-9631-e5e28f624c80"
|
|
]
|
|
},
|
|
"997a4aa0-bbe7-4174-a011-df2b48d6dc0e": {
|
|
"simStepIds": [
|
|
"c6e7c7e5-cc9a-4497-9c35-1d4df1a06057"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "Depends, solve_dependencies, dependency_overrides",
|
|
"generationPrompt": "Manage dependencies and shared logic with a powerful injection system",
|
|
"generationKeywords": "Depends, solve_dependencies, dependency_overrides"
|
|
},
|
|
"Implement standard security and authentication schemes": {
|
|
"name": "Implement standard security and authentication schemes",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "331ce70f-4acc-4bdb-89da-3da66c565408",
|
|
"diagramNodeId": "75f350d9-2d38-490b-a819-4ca969223fcb",
|
|
"simStepLabel": "Config: Define OAuth2 Security Scheme",
|
|
"simStepDescription": "An instance of `OAuth2PasswordBearer` is created. This object holds the configuration for the OAuth2 security scheme, including the URL where clients will send a username and password to get a token. This instance is also a 'callable' that will be used as a dependency.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "9",
|
|
"endLine": "9",
|
|
"relevantVariables": [
|
|
"oauth2_scheme",
|
|
"OAuth2PasswordBearer"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"tokenUrl\": \"token\"}",
|
|
"outputDataExample": "{\"scheme_name\": \"OAuth2PasswordBearer\", \"model\": {\"type\": \"oauth2\", \"flows\": {\"password\": {\"tokenUrl\": \"token\", \"scopes\": {}}}}}"
|
|
},
|
|
{
|
|
"simStepId": "a5f93691-63bb-4e26-8574-763af61af93b",
|
|
"diagramNodeId": "253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"simStepLabel": "Dependency Injection: Provide Scheme as a Dependency",
|
|
"simStepDescription": "The `oauth2_scheme` object is used within a `Depends` call in the signature of the `get_current_user` function. This declares that `get_current_user` requires the result of calling the `oauth2_scheme` object for authentication. This conceptually links the security scheme to the user retrieval logic.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "25",
|
|
"endLine": "25",
|
|
"relevantVariables": [
|
|
"get_current_user",
|
|
"Depends",
|
|
"oauth2_scheme"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"dependency\": \"oauth2_scheme\"}",
|
|
"outputDataExample": "{\"dependency\": \"oauth2_scheme\"}"
|
|
},
|
|
{
|
|
"simStepId": "4d860027-f748-42b3-af9a-3e9f970b3feb",
|
|
"diagramNodeId": "0d3536ce-f083-416f-9777-ab87be3805ba",
|
|
"simStepLabel": "Config: Protect Endpoint with `get_current_user` Dependency",
|
|
"simStepDescription": "The `/users/me` endpoint is protected by adding `Depends(get_current_user)` to its signature. When a request is made to this endpoint, FastAPI will first resolve the `get_current_user` dependency before executing the endpoint's logic.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "31",
|
|
"endLine": "32",
|
|
"relevantVariables": [
|
|
"read_users_me",
|
|
"current_user",
|
|
"Depends",
|
|
"get_current_user"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"endpoint\": \"/users/me\", \"dependency\": \"get_current_user\"}",
|
|
"outputDataExample": "{}"
|
|
},
|
|
{
|
|
"simStepId": "22c1b95d-a9fc-4082-9122-451faaef6702",
|
|
"diagramNodeId": "5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"simStepLabel": "API Call: Client Sends Authenticated Request",
|
|
"simStepDescription": "A client makes a GET request to the protected `/users/me` endpoint, including an `Authorization` header with a Bearer token.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/security/oauth2.py",
|
|
"startLine": "381",
|
|
"endLine": "381",
|
|
"relevantVariables": [
|
|
"request.headers.get"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"/users/me\", \"headers\": {\"Authorization\": \"Bearer my-super-secret-token\"}}",
|
|
"outputDataExample": "{\"method\": \"GET\", \"url\": \"/users/me\", \"headers\": {\"Authorization\": \"Bearer my-super-secret-token\"}}"
|
|
},
|
|
{
|
|
"simStepId": "93c669e0-5aa9-4df0-888d-a3da5e4371e3",
|
|
"diagramNodeId": "ff6b2c18-8425-40a6-b27e-a2a860a6448d",
|
|
"simStepLabel": "Authentication: Extract Token from Request",
|
|
"simStepDescription": "FastAPI's dependency injection system calls the `oauth2_scheme` dependency. This `OAuth2PasswordBearer` instance inspects the incoming request's `Authorization` header, verifies the 'Bearer' scheme, and extracts the token string. If the header is missing or malformed, it raises a 401 HTTP exception.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/security/oauth2.py",
|
|
"startLine": "381",
|
|
"endLine": "382",
|
|
"relevantVariables": [
|
|
"request.headers.get",
|
|
"get_authorization_scheme_param"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request_headers\": {\"Authorization\": \"Bearer my-super-secret-token\"}}",
|
|
"outputDataExample": "\"my-super-secret-token\""
|
|
},
|
|
{
|
|
"simStepId": "dbbf3f0b-f780-4332-8e9c-40d49995db7e",
|
|
"diagramNodeId": "93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"simStepLabel": "Data Flow: Pass Token to User Dependency",
|
|
"simStepDescription": "The extracted token string is passed as the `token` argument to the `get_current_user` dependency function.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "25",
|
|
"endLine": "25",
|
|
"relevantVariables": [
|
|
"get_current_user",
|
|
"token"
|
|
]
|
|
},
|
|
"inputDataExample": "\"my-super-secret-token\"",
|
|
"outputDataExample": "\"my-super-secret-token\""
|
|
},
|
|
{
|
|
"simStepId": "6f7707ff-b3dd-40c5-9c4e-bf1effd6c651",
|
|
"diagramNodeId": "8f262716-e919-4f69-9c85-095021269fa5",
|
|
"simStepLabel": "Business Logic: Retrieve User from Token",
|
|
"simStepDescription": "The `get_current_user` function executes its logic. It calls a utility function (`fake_decode_token`) to convert the token string into a user object. In a real application, this step would involve decoding a JWT and/or fetching user data from a database.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "26",
|
|
"endLine": "27",
|
|
"relevantVariables": [
|
|
"get_current_user",
|
|
"fake_decode_token",
|
|
"user"
|
|
]
|
|
},
|
|
"inputDataExample": "\"my-super-secret-token\"",
|
|
"outputDataExample": "{\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}"
|
|
},
|
|
{
|
|
"simStepId": "5f30ed11-8b51-4764-ad5d-3e7e5b41dea3",
|
|
"diagramNodeId": "31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"simStepLabel": "Dependency Injection: Inject User Object into Path Operation",
|
|
"simStepDescription": "The user object returned by `get_current_user` is injected by FastAPI into the `read_users_me` path operation function as the `current_user` parameter.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "31",
|
|
"endLine": "32",
|
|
"relevantVariables": [
|
|
"read_users_me",
|
|
"current_user"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}",
|
|
"outputDataExample": "{\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}"
|
|
},
|
|
{
|
|
"simStepId": "8eeb8c1a-62a8-444b-ac96-5f5e3b355d26",
|
|
"diagramNodeId": "65ee418b-cdcf-4852-b605-afa3d1f990aa",
|
|
"simStepLabel": "Business Logic: Execute Endpoint Logic",
|
|
"simStepDescription": "The `read_users_me` function is executed with the resolved `current_user` dependency. It simply returns the user object, which FastAPI will then serialize into a JSON response.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/security/tutorial002_an_py310.py",
|
|
"startLine": "32",
|
|
"endLine": "32",
|
|
"relevantVariables": [
|
|
"read_users_me",
|
|
"current_user"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"current_user\": {\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}}",
|
|
"outputDataExample": "{\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}"
|
|
},
|
|
{
|
|
"simStepId": "ad4d8ae8-9ce9-4a9e-ae42-bae34566304c",
|
|
"diagramNodeId": "",
|
|
"simStepLabel": "API Response: Return JSON Response to Client",
|
|
"simStepDescription": "The user object is serialized into a JSON string and sent back to the client as the body of the HTTP 200 OK response.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "277",
|
|
"endLine": "277",
|
|
"relevantVariables": [
|
|
"response_data"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}",
|
|
"outputDataExample": "{\"username\": \"my-super-secret-tokenfakedecoded\", \"email\": \"[email protected]\", \"full_name\": \"John Doe\", \"disabled\": null}"
|
|
}
|
|
],
|
|
"description": "<ul><li>The framework provides a set of tools to implement common security protocols</li><li>It has built-in support for schemes like OAuth2 (with password and bearer token flows), API Keys (in headers, queries, or cookies), and HTTP Basic authentication</li><li>These security mechanisms are built on top of the dependency injection system, making them flexible and easy to integrate</li><li>Security requirements are also automatically reflected in the OpenAPI documentation</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"75f350d9-2d38-490b-a819-4ca969223fcb": {
|
|
"simStepIds": [
|
|
"331ce70f-4acc-4bdb-89da-3da66c565408"
|
|
]
|
|
},
|
|
"0d3536ce-f083-416f-9777-ab87be3805ba": {
|
|
"simStepIds": [
|
|
"4d860027-f748-42b3-af9a-3e9f970b3feb"
|
|
]
|
|
},
|
|
"ff6b2c18-8425-40a6-b27e-a2a860a6448d": {
|
|
"simStepIds": [
|
|
"93c669e0-5aa9-4df0-888d-a3da5e4371e3"
|
|
]
|
|
},
|
|
"8f262716-e919-4f69-9c85-095021269fa5": {
|
|
"simStepIds": [
|
|
"6f7707ff-b3dd-40c5-9c4e-bf1effd6c651"
|
|
]
|
|
},
|
|
"65ee418b-cdcf-4852-b605-afa3d1f990aa": {
|
|
"simStepIds": [
|
|
"8eeb8c1a-62a8-444b-ac96-5f5e3b355d26"
|
|
]
|
|
},
|
|
"253c3208-f450-42d2-9077-3f3ade4fcdaf": {
|
|
"simStepIds": [
|
|
"a5f93691-63bb-4e26-8574-763af61af93b"
|
|
]
|
|
},
|
|
"5ba138ab-65ed-4518-bad2-c6547536ee42": {
|
|
"simStepIds": [
|
|
"22c1b95d-a9fc-4082-9122-451faaef6702"
|
|
]
|
|
},
|
|
"93bdc64f-4b39-440b-a6f2-ab491f9ef575": {
|
|
"simStepIds": [
|
|
"dbbf3f0b-f780-4332-8e9c-40d49995db7e"
|
|
]
|
|
},
|
|
"31b1cc97-11e9-49ad-a4d3-212f95564fbc": {
|
|
"simStepIds": [
|
|
"5f30ed11-8b51-4764-ad5d-3e7e5b41dea3"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "Security, OAuth2PasswordBearer, get_current_user",
|
|
"generationPrompt": "Implement standard security and authentication schemes",
|
|
"generationKeywords": "Security, OAuth2PasswordBearer, get_current_user"
|
|
},
|
|
"Declare and validate parameters from various request sources": {
|
|
"name": "Declare and validate parameters from various request sources",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "c7f20cc8-9c3a-42a6-995f-39a4280ead6e",
|
|
"diagramNodeId": "3272394c-4b6b-4e76-872d-d6916dc99c37",
|
|
"simStepLabel": "Define Path Operation with Parameter Validation",
|
|
"simStepDescription": "A developer defines an API endpoint using a decorator like `@app.put`. Parameters for the path (`item_id`), query (`q`), and request body (`item`, `user`, `importance`) are declared with type hints. Helper functions like `Path`, `Query`, and `Body` are used to specify their source and apply validation rules (e.g., `gt=0`).",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/body_multiple_params/tutorial003.py",
|
|
"startLine": "9",
|
|
"endLine": "24",
|
|
"relevantVariables": [
|
|
"app.put",
|
|
"item_id: int",
|
|
"item: Item",
|
|
"user: User",
|
|
"importance: int = Body(gt=0)",
|
|
"q: str | None = None"
|
|
]
|
|
},
|
|
"inputDataExample": "null",
|
|
"outputDataExample": "{\"path\": \"/items/{item_id}\", \"method\": \"PUT\", \"params\": {\"item_id\": \"Path\", \"item\": \"Body\", \"user\": \"Body\", \"importance\": \"Body\", \"q\": \"Query\"}}"
|
|
},
|
|
{
|
|
"simStepId": "a2997e81-9fc8-4f9d-adf2-7fac56a58991",
|
|
"diagramNodeId": "f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"simStepLabel": "Register Path Operation with Router",
|
|
"simStepDescription": "The path operation decorator (`@app.put`) takes the path, function, and configuration, and registers it with the application's router by creating an `APIRoute`.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "2150",
|
|
"endLine": "2192",
|
|
"relevantVariables": [
|
|
"put",
|
|
"add_api_route"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"path\": \"/items/{item_id}\", \"method\": \"PUT\", \"params\": {\"item_id\": \"Path\", \"item\": \"Body\", \"user\": \"Body\", \"importance\": \"Body\", \"q\": \"Query\"}}",
|
|
"outputDataExample": "{\"path\": \"/items/{item_id}\", \"method\": \"PUT\", \"params\": {\"item_id\": \"Path\", \"item\": \"Body\", \"user\": \"Body\", \"importance\": \"Body\", \"q\": \"Query\"}}"
|
|
},
|
|
{
|
|
"simStepId": "99ccde73-4228-43bc-ac85-bc419331ab5b",
|
|
"diagramNodeId": "760ebe9f-b9e2-407a-ab19-aae6b8b0c27c",
|
|
"simStepLabel": "Analyze Endpoint Signature and Create Dependant",
|
|
"simStepDescription": "During the `APIRoute` creation, FastAPI calls `get_dependant`. This function inspects the endpoint's signature, analyzing each parameter's type and default value (`Path`, `Query`, `Body`, etc.). It creates `ModelField` objects for each parameter, capturing validation rules, and stores them in a `Dependant` object, categorized by their source (path, query, header, body).",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "273",
|
|
"endLine": "578",
|
|
"relevantVariables": [
|
|
"get_dependant",
|
|
"get_param_field",
|
|
"path_param_names",
|
|
"dependant"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"path\": \"/items/{item_id}\", \"call\": \"<function update_item>\"}",
|
|
"outputDataExample": "{\"path_params\": [{\"name\": \"item_id\", \"type\": \"int\", \"required\": true}], \"query_params\": [{\"name\": \"q\", \"type\": \"str\", \"required\": false}], \"body_params\": [{\"name\": \"item\"}, {\"name\": \"user\"}, {\"name\": \"importance\"}]}"
|
|
},
|
|
{
|
|
"simStepId": "8a4b91fb-6482-4753-834a-2b9328f3941d",
|
|
"diagramNodeId": "c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"simStepLabel": "HTTP Request Received",
|
|
"simStepDescription": "An incoming HTTP request is received by the ASGI server. Starlette's router matches the URL path to the corresponding `APIRoute`, and the request is passed to the FastAPI application instance.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1096",
|
|
"endLine": "1096",
|
|
"relevantVariables": [
|
|
"__call__"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"PUT\", \"url\": \"/items/42?q=test_query\", \"headers\": {\"Content-Type\": \"application/json\"}, \"body\": \"{\\\"item\\\": {\\\"name\\\": \\\"Foo\\\", \\\"price\\\": 45.2}, \\\"user\\\": {\\\"username\\\": \\\"johndoe\\\", \\\"full_name\\\": \\\"John Doe\\\"}, \\\"importance\\\": 5}\"}",
|
|
"outputDataExample": "{\"method\": \"PUT\", \"url\": \"/items/42?q=test_query\", \"headers\": {\"Content-Type\": \"application/json\"}, \"body\": \"{\\\"item\\\": {\\\"name\\\": \\\"Foo\\\", \\\"price\\\": 45.2}, \\\"user\\\": {\\\"username\\\": \\\"johndoe\\\", \\\"full_name\\\": \\\"John Doe\\\"}, \\\"importance\\\": 5}\"}"
|
|
},
|
|
{
|
|
"simStepId": "de4c4a4a-b0ac-46a6-9944-b98922d68fef",
|
|
"diagramNodeId": "1528bb9f-0a02-44f7-8fb9-f12c89cff357",
|
|
"simStepLabel": "Extract Raw Data from Request",
|
|
"simStepDescription": "Inside the `APIRoute.handle` method, data is extracted from the raw request. Path parameters are parsed from the URL. For JSON requests, `request.json()` is awaited to parse the body. For form data, `request.form()` would be called. Query parameters and headers are also made available from the request object.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "333",
|
|
"endLine": "371",
|
|
"relevantVariables": [
|
|
"request.json",
|
|
"request.form",
|
|
"solve_dependencies"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"PUT\", \"url\": \"/items/42?q=test_query\", \"headers\": {\"Content-Type\": \"application/json\"}}",
|
|
"outputDataExample": "{\"path_params\": {\"item_id\": \"42\"}, \"query_params\": \"q=test_query\", \"json_body\": {\"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5}}"
|
|
},
|
|
{
|
|
"simStepId": "16cb1e94-5a42-47e2-8661-e932a4148bff",
|
|
"diagramNodeId": "c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"simStepLabel": "Pass Raw Data for Validation",
|
|
"simStepDescription": "The extracted raw parameter values (from path, query, headers, and body) are passed along with the pre-computed `Dependant` object to the `solve_dependencies` function for validation and type conversion.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "371",
|
|
"endLine": "371",
|
|
"relevantVariables": [
|
|
"solve_dependencies"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"dependant\": \"<Dependant object>\", \"request_data\": {\"path_params\": {\"item_id\": \"42\"}, \"query_params\": {\"q\": \"test_query\"}, \"json_body\": {\"item\": {\"name\": \"Foo\", ...}}}}",
|
|
"outputDataExample": "{\"dependant\": \"<Dependant object>\", \"request_data\": {\"path_params\": {\"item_id\": \"42\"}, \"query_params\": {\"q\": \"test_query\"}, \"json_body\": {\"item\": {\"name\": \"Foo\", ...}}}}"
|
|
},
|
|
{
|
|
"simStepId": "b4eaa910-fd79-4356-82a8-0c56e90ca2cf",
|
|
"diagramNodeId": "5512bc30-2be8-49c0-9f1a-b4df70f28286",
|
|
"simStepLabel": "Validate and Convert Parameters",
|
|
"simStepDescription": "The `solve_dependencies` function processes the raw parameters against the rules defined in the `Dependant` object. It uses helpers like `request_params_to_args` and `request_body_to_args` to validate the data. This includes type casting (e.g., string '42' to integer 42), applying validation rules (`gt=0`), and handling aliases. If validation fails, a `RequestValidationError` is raised.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "581",
|
|
"endLine": "712",
|
|
"relevantVariables": [
|
|
"solve_dependencies",
|
|
"request_params_to_args",
|
|
"request_body_to_args",
|
|
"path_values",
|
|
"query_values",
|
|
"header_values",
|
|
"body_values"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"path_params\": {\"item_id\": \"42\"}, \"query_params\": \"q=test_query\", \"json_body\": {\"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5}}",
|
|
"outputDataExample": "{\"values\": {\"item_id\": 42, \"q\": \"test_query\", \"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5}, \"errors\": []}"
|
|
},
|
|
{
|
|
"simStepId": "ea22f412-f25b-414f-b8de-5564d2f9a7c0",
|
|
"diagramNodeId": "678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"simStepLabel": "Pass Validated Arguments to Endpoint Function",
|
|
"simStepDescription": "The dictionary of validated, type-converted values is passed to be used as keyword arguments for the user's path operation function.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "402",
|
|
"endLine": "402",
|
|
"relevantVariables": [
|
|
"solved_result.values",
|
|
"dependant.call"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"item_id\": 42, \"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5, \"q\": \"test_query\"}",
|
|
"outputDataExample": "{\"item_id\": 42, \"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5, \"q\": \"test_query\"}"
|
|
},
|
|
{
|
|
"simStepId": "62acd131-b4d2-4f6d-9e2e-67f61f5b1b95",
|
|
"diagramNodeId": "53058048-3874-442b-a561-6a04804417d7",
|
|
"simStepLabel": "Execute Path Operation Function",
|
|
"simStepDescription": "The user-defined path operation function is finally executed with the validated and converted data passed as arguments. The function's return value will be used to generate the final HTTP response.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/body_multiple_params/tutorial003.py",
|
|
"startLine": "9",
|
|
"endLine": "24",
|
|
"relevantVariables": [
|
|
"update_item",
|
|
"item_id",
|
|
"item",
|
|
"user",
|
|
"importance",
|
|
"q"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"item_id\": 42, \"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5, \"q\": \"test_query\"}",
|
|
"outputDataExample": "{\"results\": {\"item_id\": 42, \"item\": {\"name\": \"Foo\", \"price\": 45.2}, \"user\": {\"username\": \"johndoe\", \"full_name\": \"John Doe\"}, \"importance\": 5, \"q\": \"test_query\"}}"
|
|
}
|
|
],
|
|
"description": "<ul><li>FastAPI allows for the declarative definition of parameters from all parts of an HTTP request</li><li>Using functions like <code>Path</code>, <code>Query</code>, <code>Header</code>, <code>Cookie</code>, <code>Body</code>, <code>Form</code>, and <code>File</code> as parameter defaults, developers can specify where to extract data from</li><li>The framework then handles the extraction, type conversion, and validation of this data, supporting a wide range of validation rules like length constraints, numeric ranges, and regex patterns</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"3272394c-4b6b-4e76-872d-d6916dc99c37": {
|
|
"simStepIds": [
|
|
"c7f20cc8-9c3a-42a6-995f-39a4280ead6e"
|
|
]
|
|
},
|
|
"760ebe9f-b9e2-407a-ab19-aae6b8b0c27c": {
|
|
"simStepIds": [
|
|
"99ccde73-4228-43bc-ac85-bc419331ab5b"
|
|
]
|
|
},
|
|
"1528bb9f-0a02-44f7-8fb9-f12c89cff357": {
|
|
"simStepIds": [
|
|
"de4c4a4a-b0ac-46a6-9944-b98922d68fef"
|
|
]
|
|
},
|
|
"5512bc30-2be8-49c0-9f1a-b4df70f28286": {
|
|
"simStepIds": [
|
|
"b4eaa910-fd79-4356-82a8-0c56e90ca2cf"
|
|
]
|
|
},
|
|
"53058048-3874-442b-a561-6a04804417d7": {
|
|
"simStepIds": [
|
|
"62acd131-b4d2-4f6d-9e2e-67f61f5b1b95"
|
|
]
|
|
},
|
|
"f7377c05-48b6-4245-b09b-30e0abea3484": {
|
|
"simStepIds": [
|
|
"a2997e81-9fc8-4f9d-adf2-7fac56a58991"
|
|
]
|
|
},
|
|
"c85c9776-5f78-48a8-af8b-764a29b604fc": {
|
|
"simStepIds": [
|
|
"8a4b91fb-6482-4753-834a-2b9328f3941d"
|
|
]
|
|
},
|
|
"c178ca0c-2977-4fc1-bba5-9daf176b094e": {
|
|
"simStepIds": [
|
|
"16cb1e94-5a42-47e2-8661-e932a4148bff"
|
|
]
|
|
},
|
|
"678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4": {
|
|
"simStepIds": [
|
|
"ea22f412-f25b-414f-b8de-5564d2f9a7c0"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "Path, Query, Header, Form",
|
|
"generationPrompt": "Declare and validate parameters from various request sources",
|
|
"generationKeywords": "Path, Query, Header, Form"
|
|
},
|
|
"Build high-performance services with asynchronous support": {
|
|
"name": "Build high-performance services with asynchronous support",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "cda447ab-9d46-497c-a8cb-c2892e622443",
|
|
"diagramNodeId": "6d538c95-7002-4e13-a58e-42276e93a916",
|
|
"simStepLabel": "1. Define an Asynchronous Path Operation",
|
|
"simStepDescription": "A developer defines a path operation function using `async def`. This signals to FastAPI that the function is a coroutine, allowing for the use of `await` for non-blocking operations and enabling high concurrency.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/async_tests/main.py",
|
|
"startLine": "6",
|
|
"endLine": "9",
|
|
"relevantVariables": [
|
|
"app",
|
|
"root"
|
|
]
|
|
},
|
|
"inputDataExample": "null",
|
|
"outputDataExample": "null"
|
|
},
|
|
{
|
|
"simStepId": "71aea8b0-90a3-4fcb-a6b0-f4666a7b6b51",
|
|
"diagramNodeId": "d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"simStepLabel": "2. Application Initialization and Route Registration",
|
|
"simStepDescription": "When the application starts, the FastAPI instance is created, and the `@app.get('/')` decorator registers the `root` coroutine function as the handler for GET requests to the root path.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1140",
|
|
"endLine": "1140",
|
|
"relevantVariables": [
|
|
"add_api_route"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"path\": \"/\", \"endpoint\": \"<function root at 0x...>\n\", \"methods\": [\"GET\"]}",
|
|
"outputDataExample": "{\"path\": \"/\", \"endpoint\": \"<function root at 0x...>\n\", \"methods\": [\"GET\"]}"
|
|
},
|
|
{
|
|
"simStepId": "af17a645-e3b8-4db6-8ade-2962b52b1ddb",
|
|
"diagramNodeId": "723adc58-e008-43e8-a4a5-f27f1e5b9b72",
|
|
"simStepLabel": "3. ASGI Server Receives Request",
|
|
"simStepDescription": "An ASGI server (like Uvicorn) receives an HTTP GET request for '/'. It constructs a standard `scope` dictionary with request details and passes it to the FastAPI application's main `__call__` method.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1131",
|
|
"endLine": "1134",
|
|
"relevantVariables": [
|
|
"__call__",
|
|
"scope",
|
|
"receive",
|
|
"send"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"scope\": {\"type\": \"http\", \"method\": \"GET\", \"path\": \"/\", \"headers\": [[\"host\", \"localhost:8000\"]]}, \"receive\": \"<ASGIReceive callable>\", \"send\": \"<ASGISend callable>\"}",
|
|
"outputDataExample": "null"
|
|
},
|
|
{
|
|
"simStepId": "f60b3966-22e3-435a-aace-d86055caea49",
|
|
"diagramNodeId": "3645da23-6b02-4826-989e-51ba79139b97",
|
|
"simStepLabel": "4. Request Passed to Router",
|
|
"simStepDescription": "The application passes the `scope`, `receive`, and `send` arguments to the underlying router (from Starlette) to find the route that matches the request path.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1134",
|
|
"endLine": "1134",
|
|
"relevantVariables": [
|
|
"super().__call__"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"scope\": {\"type\": \"http\", \"method\": \"GET\", \"path\": \"/\"}}",
|
|
"outputDataExample": "{\"scope\": {\"type\": \"http\", \"method\": \"GET\", \"path\": \"/\"}}"
|
|
},
|
|
{
|
|
"simStepId": "cb5273ef-8960-4c8b-8195-7a6384823794",
|
|
"diagramNodeId": "4d253d9a-189a-4b27-bb06-5862fbba7283",
|
|
"simStepLabel": "5. Select Handler based on Function Type",
|
|
"simStepDescription": "The router matches the request to the `root` function. The `request_response` wrapper checks if the handler is an async function. Since `root` was defined with `async def`, `is_async_callable` returns true, and the function is marked for direct awaiting.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "95",
|
|
"endLine": "97",
|
|
"relevantVariables": [
|
|
"request_response",
|
|
"func",
|
|
"is_async_callable",
|
|
"run_in_threadpool"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"func\": \"<coroutine function root>\"}",
|
|
"outputDataExample": "{\"f\": \"<awaitable function root>\"}"
|
|
},
|
|
{
|
|
"simStepId": "514470f7-50a0-47ac-a636-8956036a0617",
|
|
"diagramNodeId": "badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"simStepLabel": "6. Prepare Endpoint Execution",
|
|
"simStepDescription": "The system prepares to execute the endpoint. This involves resolving dependencies (if any) and then calling the endpoint function with the required arguments.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "388",
|
|
"endLine": "388",
|
|
"relevantVariables": [
|
|
"run_endpoint_function"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"dependant\": \"<Dependant for root>\", \"request\": \"<Request object>\"}",
|
|
"outputDataExample": "{\"dependant\": \"<Dependant for root>\", \"request\": \"<Request object>\"}"
|
|
},
|
|
{
|
|
"simStepId": "7aee408c-be01-4088-a719-d30b71bd7973",
|
|
"diagramNodeId": "5be4df9c-50fb-41d0-a436-85a1be744dc5",
|
|
"simStepLabel": "7. Await the Coroutine Endpoint",
|
|
"simStepDescription": "The `run_endpoint_function` checks if the handler is a coroutine. Since it is, the function is executed using `await`. This allows the event loop to switch to other tasks if the endpoint itself awaits a long-running I/O operation, preventing the server from blocking.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "287",
|
|
"endLine": "288",
|
|
"relevantVariables": [
|
|
"is_coroutine",
|
|
"await dependant.call(**values)"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"dependant\": {\"call\": \"<coroutine root>\"}, \"values\": {}, \"is_coroutine\": true}",
|
|
"outputDataExample": "{\"message\": \"Tomato\"}"
|
|
},
|
|
{
|
|
"simStepId": "6b00d867-9ecb-4c51-be8b-06432f1af04f",
|
|
"diagramNodeId": "7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"simStepLabel": "8. Raw Response Returned",
|
|
"simStepDescription": "The result from the awaited endpoint function (a Python dictionary) is returned to the request handler.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "391",
|
|
"endLine": "391",
|
|
"relevantVariables": [
|
|
"raw_response"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"message\": \"Tomato\"}",
|
|
"outputDataExample": "{\"message\": \"Tomato\"}"
|
|
},
|
|
{
|
|
"simStepId": "d6a1afe7-2b97-49ad-9e12-3aa5332905b9",
|
|
"diagramNodeId": "3b4760d0-0289-4c64-9a67-b0b7911cb094",
|
|
"simStepLabel": "9. Serialize the Response",
|
|
"simStepDescription": "The `serialize_response` function is called to convert the Python dictionary returned by the endpoint into a JSON-compatible format. This process itself can be asynchronous.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "408",
|
|
"endLine": "415",
|
|
"relevantVariables": [
|
|
"serialize_response",
|
|
"response_content"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"response_content\": {\"message\": \"Tomato\"}}",
|
|
"outputDataExample": "{\"message\": \"Tomato\"}"
|
|
},
|
|
{
|
|
"simStepId": "77d096c5-8eaa-4a70-a333-da9e81952a6d",
|
|
"diagramNodeId": "3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"simStepLabel": "10. Create Response Object",
|
|
"simStepDescription": "The serialized content is used to instantiate the final `Response` object (in this case, a `JSONResponse`), including the content, status code, and headers.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "417",
|
|
"endLine": "426",
|
|
"relevantVariables": [
|
|
"actual_response_class"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"content\": {\"message\": \"Tomato\"}, \"status_code\": 200}",
|
|
"outputDataExample": "{\"content\": {\"message\": \"Tomato\"}, \"status_code\": 200}"
|
|
},
|
|
{
|
|
"simStepId": "9e3b06fe-61d2-45aa-8d83-4b604ab90f36",
|
|
"diagramNodeId": "b74d9193-26b0-4b98-a1dc-e55e17c8a0e4",
|
|
"simStepLabel": "11. Send HTTP Response via ASGI",
|
|
"simStepDescription": "The final `Response` object is awaited, which triggers its `__call__` method. This method uses the ASGI `send` callable provided by the server to transmit the HTTP status, headers, and body back to the client.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "106",
|
|
"endLine": "106",
|
|
"relevantVariables": [
|
|
"await response(scope, receive, send)"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"response\": \"<JSONResponse object with content: {\\\"message\\\": \\\"Tomato\\\"}>\"}",
|
|
"outputDataExample": "null"
|
|
}
|
|
],
|
|
"description": "<ul><li>Built on the ASGI standard, FastAPI is asynchronous from the ground up</li><li>Developers can define their path operation functions as <code>async def</code>, allowing them to use <code>await</code> for non-blocking I/O operations (like database queries or external API calls)</li><li>This enables very high concurrency and performance, making FastAPI one of the fastest Python web frameworks available</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"6d538c95-7002-4e13-a58e-42276e93a916": {
|
|
"simStepIds": [
|
|
"cda447ab-9d46-497c-a8cb-c2892e622443"
|
|
]
|
|
},
|
|
"723adc58-e008-43e8-a4a5-f27f1e5b9b72": {
|
|
"simStepIds": [
|
|
"af17a645-e3b8-4db6-8ade-2962b52b1ddb"
|
|
]
|
|
},
|
|
"4d253d9a-189a-4b27-bb06-5862fbba7283": {
|
|
"simStepIds": [
|
|
"cb5273ef-8960-4c8b-8195-7a6384823794"
|
|
]
|
|
},
|
|
"5be4df9c-50fb-41d0-a436-85a1be744dc5": {
|
|
"simStepIds": [
|
|
"7aee408c-be01-4088-a719-d30b71bd7973"
|
|
]
|
|
},
|
|
"3b4760d0-0289-4c64-9a67-b0b7911cb094": {
|
|
"simStepIds": [
|
|
"d6a1afe7-2b97-49ad-9e12-3aa5332905b9"
|
|
]
|
|
},
|
|
"b74d9193-26b0-4b98-a1dc-e55e17c8a0e4": {
|
|
"simStepIds": [
|
|
"9e3b06fe-61d2-45aa-8d83-4b604ab90f36"
|
|
]
|
|
},
|
|
"d4810b21-a037-499b-bf29-64229b7fb89d": {
|
|
"simStepIds": [
|
|
"71aea8b0-90a3-4fcb-a6b0-f4666a7b6b51"
|
|
]
|
|
},
|
|
"3645da23-6b02-4826-989e-51ba79139b97": {
|
|
"simStepIds": [
|
|
"f60b3966-22e3-435a-aace-d86055caea49"
|
|
]
|
|
},
|
|
"badccb56-99c5-43c0-8a2b-d49fb9b2c1cd": {
|
|
"simStepIds": [
|
|
"514470f7-50a0-47ac-a636-8956036a0617"
|
|
]
|
|
},
|
|
"7c922d0b-5375-43f1-9ee5-5129e67ae842": {
|
|
"simStepIds": [
|
|
"6b00d867-9ecb-4c51-be8b-06432f1af04f"
|
|
]
|
|
},
|
|
"3bd58e0f-f6e9-402f-9597-cee988b040b1": {
|
|
"simStepIds": [
|
|
"77d096c5-8eaa-4a70-a333-da9e81952a6d"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "async def, await, asyncio",
|
|
"generationPrompt": "Build high-performance services with asynchronous support",
|
|
"generationKeywords": "async def, await, asyncio"
|
|
},
|
|
"Test API endpoints easily using a provided test client": {
|
|
"name": "Test API endpoints easily using a provided test client",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "775603fe-da91-489f-996b-84107c8f7862",
|
|
"diagramNodeId": "bf1edc05-08ee-4c1c-80cf-21b4f531e0fe",
|
|
"simStepLabel": "Instantiate TestClient",
|
|
"simStepDescription": "A TestClient instance is created by passing the FastAPI application object to its constructor. This client will be used to make requests to the application without a running server.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/app_testing/tutorial001.py",
|
|
"startLine": "12",
|
|
"endLine": "12",
|
|
"relevantVariables": [
|
|
"client",
|
|
"TestClient",
|
|
"app"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app\": \"<FastAPI application object>\"}",
|
|
"outputDataExample": "{\"client\": \"<TestClient instance>\"}"
|
|
},
|
|
{
|
|
"simStepId": "a26868d0-9f91-4185-8655-04b861761020",
|
|
"diagramNodeId": "1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"simStepLabel": "Application Passed to TestClient",
|
|
"simStepDescription": "The FastAPI application object is passed into the TestClient constructor. The TestClient wraps the application to handle in-process requests by acting as an ASGI server.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/testclient.py",
|
|
"startLine": "2",
|
|
"endLine": "2",
|
|
"relevantVariables": [
|
|
"TestClient"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app\": \"<FastAPI application object>\"}",
|
|
"outputDataExample": "{\"app\": \"<FastAPI application object>\"}"
|
|
},
|
|
{
|
|
"simStepId": "31594c7d-7192-434e-aedb-53c1584bf215",
|
|
"diagramNodeId": "1c4e4a6c-1cb3-4852-986c-ea94a4fff224",
|
|
"simStepLabel": "Make a Request with TestClient",
|
|
"simStepDescription": "The test function uses the client instance to make a simulated HTTP GET request to the `/` endpoint of the application. This call does not go through the network stack.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/app_testing/tutorial001.py",
|
|
"startLine": "16",
|
|
"endLine": "16",
|
|
"relevantVariables": [
|
|
"response",
|
|
"client.get"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"path\": \"/\"}",
|
|
"outputDataExample": "{\"response\": \"<httpx.Response object>\"}"
|
|
},
|
|
{
|
|
"simStepId": "a9785563-55e1-46e5-8f87-ea5544bb32a0",
|
|
"diagramNodeId": "0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"simStepLabel": "Request Dispatched to FastAPI App",
|
|
"simStepDescription": "The TestClient internally uses httpx to build an ASGI scope representing the HTTP request and dispatches it directly to the FastAPI application for processing.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/app_testing/tutorial001.py",
|
|
"startLine": "16",
|
|
"endLine": "16",
|
|
"relevantVariables": [
|
|
"client.get"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"scope\": {\"type\": \"http\", \"method\": \"GET\", \"path\": \"/\", \"headers\": [[\"host\", \"testserver\"]]}}",
|
|
"outputDataExample": "{\"scope\": {\"type\": \"http\", \"method\": \"GET\", \"path\": \"/\", \"headers\": [[\"host\", \"testserver\"]]}}"
|
|
},
|
|
{
|
|
"simStepId": "6036575c-1bb4-44d0-b975-985fd3d17016",
|
|
"diagramNodeId": "57c79588-0531-4abc-b526-cf50845249a7",
|
|
"simStepLabel": "Execute Path Operation Function",
|
|
"simStepDescription": "FastAPI's router identifies the matching path operation function, `read_main`, decorated with `@app.get(\"/\")`. The function is executed and returns a dictionary.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/app_testing/tutorial001.py",
|
|
"startLine": "8",
|
|
"endLine": "10",
|
|
"relevantVariables": [
|
|
"read_main"
|
|
]
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{\"msg\": \"Hello World\"}"
|
|
},
|
|
{
|
|
"simStepId": "94a37941-4c78-4ba5-9a30-98a78e824b1e",
|
|
"diagramNodeId": "a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"simStepLabel": "Response Returned to TestClient",
|
|
"simStepDescription": "FastAPI converts the dictionary returned by the path operation into a JSONResponse and sends it back. The TestClient captures this response as an `httpx.Response` object.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/app_testing/tutorial001.py",
|
|
"startLine": "10",
|
|
"endLine": "10",
|
|
"relevantVariables": [
|
|
"return {\"msg\": \"Hello World\"}"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"status_code\": 200, \"body\": {\"msg\": \"Hello World\"}, \"headers\": {\"content-type\": \"application/json\"}}",
|
|
"outputDataExample": "{\"status_code\": 200, \"body\": {\"msg\": \"Hello World\"}, \"headers\": {\"content-type\": \"application/json\"}}"
|
|
},
|
|
{
|
|
"simStepId": "84a2b60d-be4a-4bba-80bc-3069c0e96cb6",
|
|
"diagramNodeId": "970abd06-2dc8-4102-8055-8933609aeb67",
|
|
"simStepLabel": "Assert Response in Test",
|
|
"simStepDescription": "The test function asserts that the received response has a `200` status code and that its JSON body matches the expected content, confirming the endpoint works correctly.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/app_testing/tutorial001.py",
|
|
"startLine": "17",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"response.status_code",
|
|
"response.json"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"response\": {\"status_code\": 200, \"json\": {\"msg\": \"Hello World\"}}}",
|
|
"outputDataExample": "{}"
|
|
},
|
|
{
|
|
"simStepId": "749ef148-2b08-4234-9248-1ef9325528d3",
|
|
"diagramNodeId": "cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"simStepLabel": "Transition to Dependency Override",
|
|
"simStepDescription": "This edge represents the transition to a more advanced testing scenario where a dependency is overridden to isolate the test from external services or complex logic.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs/en/docs/advanced/testing-dependencies.md",
|
|
"startLine": "19",
|
|
"endLine": "22",
|
|
"relevantVariables": []
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{}"
|
|
},
|
|
{
|
|
"simStepId": "c52deddc-1975-4055-873c-0f72bf2dc3cb",
|
|
"diagramNodeId": "38c3f10f-2301-458f-8ea1-2c20041c520a",
|
|
"simStepLabel": "Set Dependency Override",
|
|
"simStepDescription": "Before making a request, the test modifies the `app.dependency_overrides` dictionary. This maps an original dependency (`common_parameters`) to a new function (`override_dependency`) that will be executed instead during the test.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/dependency_testing/tutorial001.py",
|
|
"startLine": "32",
|
|
"endLine": "32",
|
|
"relevantVariables": [
|
|
"app.dependency_overrides",
|
|
"common_parameters",
|
|
"override_dependency"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"original_dependency\": \"<function common_parameters>\", \"override_function\": \"<function override_dependency>\"}",
|
|
"outputDataExample": "{\"app.dependency_overrides\": {\"<function common_parameters>\": \"<function override_dependency>\"}}"
|
|
},
|
|
{
|
|
"simStepId": "13ed8244-da90-47be-a387-2648e230906f",
|
|
"diagramNodeId": "ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"simStepLabel": "Override Stored in App",
|
|
"simStepDescription": "The FastAPI instance now holds the override mapping. This dictionary will be checked during the dependency resolution process for all subsequent incoming requests.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "947",
|
|
"endLine": "953",
|
|
"relevantVariables": [
|
|
"self.dependency_overrides"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app.dependency_overrides\": {\"<function common_parameters>\": \"<function override_dependency>\"}}",
|
|
"outputDataExample": "{\"app.dependency_overrides\": {\"<function common_parameters>\": \"<function override_dependency>\"}}"
|
|
},
|
|
{
|
|
"simStepId": "557f6440-8ca0-4cae-922e-4c5da5dc8da9",
|
|
"diagramNodeId": "71af56b2-6d44-43a3-a912-2a66fa6e854c",
|
|
"simStepLabel": "Make Request to Endpoint with Overridden Dependency",
|
|
"simStepDescription": "The TestClient sends a GET request to `/items/`, an endpoint that relies on the `common_parameters` dependency that was just overridden.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/dependency_testing/tutorial001.py",
|
|
"startLine": "36",
|
|
"endLine": "36",
|
|
"relevantVariables": [
|
|
"client.get"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"path\": \"/items/\"}",
|
|
"outputDataExample": "{\"response\": \"<Response object>\"}"
|
|
},
|
|
{
|
|
"simStepId": "608b856c-54dd-438b-ab09-0d8162edbb10",
|
|
"diagramNodeId": "b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"simStepLabel": "Request Triggers Dependency Resolution",
|
|
"simStepDescription": "As FastAPI processes the request, it begins to resolve the dependencies for the `/items/` endpoint, including the `common_parameters` dependency.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "377",
|
|
"endLine": "383",
|
|
"relevantVariables": [
|
|
"solve_dependencies",
|
|
"dependency_overrides_provider"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request_path\": \"/items/\", \"dependencies\": [\"common_parameters\"]}",
|
|
"outputDataExample": "{\"request_path\": \"/items/\", \"dependencies\": [\"common_parameters\"]}"
|
|
},
|
|
{
|
|
"simStepId": "62faa1e9-54f0-47a0-b0fb-edb3be742c09",
|
|
"diagramNodeId": "9e49809a-f9f0-44b7-af22-ccc5f43b02c7",
|
|
"simStepLabel": "Execute Override Function",
|
|
"simStepDescription": "The dependency injection system checks `app.dependency_overrides` and finds a match for `common_parameters`. It then executes the override function, `override_dependency`, instead of the original one.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/dependencies/utils.py",
|
|
"startLine": "609",
|
|
"endLine": "618",
|
|
"relevantVariables": [
|
|
"dependency_overrides_provider.dependency_overrides",
|
|
"call",
|
|
"original_call"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"dependency_to_solve\": \"<function common_parameters>\"}",
|
|
"outputDataExample": "{\"resolved_value\": {\"q\": null, \"skip\": 5, \"limit\": 10}}"
|
|
},
|
|
{
|
|
"simStepId": "d3f981a3-7782-49a8-901b-5103f3c6317f",
|
|
"diagramNodeId": "3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"simStepLabel": "Inject Mock Data into Endpoint",
|
|
"simStepDescription": "The dictionary returned by the `override_dependency` function is injected into the `read_items` path operation function as the `commons` argument.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/dependency_testing/tutorial001.py",
|
|
"startLine": "17",
|
|
"endLine": "17",
|
|
"relevantVariables": [
|
|
"commons",
|
|
"Depends(common_parameters)"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"commons\": {\"q\": null, \"skip\": 5, \"limit\": 10}}",
|
|
"outputDataExample": "{\"commons\": {\"q\": null, \"skip\": 5, \"limit\": 10}}"
|
|
},
|
|
{
|
|
"simStepId": "3b306a98-022e-4b79-9315-8d86042184d0",
|
|
"diagramNodeId": "0627101a-26d2-4e87-86b0-ab6e9c5e83ad",
|
|
"simStepLabel": "Assert Response with Mocked Data",
|
|
"simStepDescription": "The test function receives the final response and asserts that its content is based on the data provided by the `override_dependency`, confirming the override was successful.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/dependency_testing/tutorial001.py",
|
|
"startLine": "37",
|
|
"endLine": "39",
|
|
"relevantVariables": [
|
|
"response.status_code",
|
|
"response.json"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"response\": {\"status_code\": 200, \"json\": {\"message\": \"Hello Items!\", \"params\": {\"q\": null, \"skip\": 5, \"limit\": 10}}}}",
|
|
"outputDataExample": "{}"
|
|
},
|
|
{
|
|
"simStepId": "d351ce27-af6c-4deb-b663-45e7cdc3a807",
|
|
"diagramNodeId": "19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"simStepLabel": "Prepare for Test Teardown",
|
|
"simStepDescription": "After the assertions pass, the test function proceeds to the cleanup phase to ensure no side effects for other tests.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "tests/test_dependency_overrides.py",
|
|
"startLine": "275",
|
|
"endLine": "275",
|
|
"relevantVariables": []
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{}"
|
|
},
|
|
{
|
|
"simStepId": "e74a56d7-7c39-4391-8202-b685d0c85ea2",
|
|
"diagramNodeId": "5ff2344e-a0ef-4568-8efc-3e9007a015f9",
|
|
"simStepLabel": "Clear Dependency Overrides",
|
|
"simStepDescription": "To prevent the override from affecting subsequent tests, the `app.dependency_overrides` dictionary is cleared by setting it to an empty dictionary. This restores the original dependencies for other tests.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "tests/test_dependency_overrides.py",
|
|
"startLine": "275",
|
|
"endLine": "275",
|
|
"relevantVariables": [
|
|
"app.dependency_overrides"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app.dependency_overrides\": {\"<function common_parameters>\": \"<function override_dependency>\"}}",
|
|
"outputDataExample": "{\"app.dependency_overrides\": {}}"
|
|
}
|
|
],
|
|
"description": "<ul><li>To facilitate testing, FastAPI provides a <code>TestClient</code> class that can make requests to the application in-process, without needing a running server</li><li>It's built on <code>httpx</code> and offers a familiar, requests-like API</li><li>This, combined with the ability to override dependencies during tests, allows for the creation of fast, reliable, and isolated unit and integration tests using standard tools like <code>pytest</code></li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"bf1edc05-08ee-4c1c-80cf-21b4f531e0fe": {
|
|
"simStepIds": [
|
|
"775603fe-da91-489f-996b-84107c8f7862"
|
|
]
|
|
},
|
|
"1c4e4a6c-1cb3-4852-986c-ea94a4fff224": {
|
|
"simStepIds": [
|
|
"31594c7d-7192-434e-aedb-53c1584bf215"
|
|
]
|
|
},
|
|
"57c79588-0531-4abc-b526-cf50845249a7": {
|
|
"simStepIds": [
|
|
"6036575c-1bb4-44d0-b975-985fd3d17016"
|
|
]
|
|
},
|
|
"970abd06-2dc8-4102-8055-8933609aeb67": {
|
|
"simStepIds": [
|
|
"84a2b60d-be4a-4bba-80bc-3069c0e96cb6"
|
|
]
|
|
},
|
|
"38c3f10f-2301-458f-8ea1-2c20041c520a": {
|
|
"simStepIds": [
|
|
"c52deddc-1975-4055-873c-0f72bf2dc3cb"
|
|
]
|
|
},
|
|
"71af56b2-6d44-43a3-a912-2a66fa6e854c": {
|
|
"simStepIds": [
|
|
"557f6440-8ca0-4cae-922e-4c5da5dc8da9"
|
|
]
|
|
},
|
|
"9e49809a-f9f0-44b7-af22-ccc5f43b02c7": {
|
|
"simStepIds": [
|
|
"62faa1e9-54f0-47a0-b0fb-edb3be742c09"
|
|
]
|
|
},
|
|
"0627101a-26d2-4e87-86b0-ab6e9c5e83ad": {
|
|
"simStepIds": [
|
|
"3b306a98-022e-4b79-9315-8d86042184d0"
|
|
]
|
|
},
|
|
"5ff2344e-a0ef-4568-8efc-3e9007a015f9": {
|
|
"simStepIds": [
|
|
"e74a56d7-7c39-4391-8202-b685d0c85ea2"
|
|
]
|
|
},
|
|
"1d40db3a-214d-4571-a103-38478d8d830a": {
|
|
"simStepIds": [
|
|
"a26868d0-9f91-4185-8655-04b861761020"
|
|
]
|
|
},
|
|
"0a7b0cb1-c602-4466-a1e8-6f2b076c75f5": {
|
|
"simStepIds": [
|
|
"a9785563-55e1-46e5-8f87-ea5544bb32a0"
|
|
]
|
|
},
|
|
"a28abe3f-2890-4751-a4c2-042299a647a1": {
|
|
"simStepIds": [
|
|
"94a37941-4c78-4ba5-9a30-98a78e824b1e"
|
|
]
|
|
},
|
|
"cebf7614-db24-432b-869f-fd8c57568bf7": {
|
|
"simStepIds": [
|
|
"749ef148-2b08-4234-9248-1ef9325528d3"
|
|
]
|
|
},
|
|
"ea2a2c4d-e465-4003-8375-a3c644eea489": {
|
|
"simStepIds": [
|
|
"13ed8244-da90-47be-a387-2648e230906f"
|
|
]
|
|
},
|
|
"b45dcb5e-18e8-46a3-95d0-7911502d6f89": {
|
|
"simStepIds": [
|
|
"608b856c-54dd-438b-ab09-0d8162edbb10"
|
|
]
|
|
},
|
|
"3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7": {
|
|
"simStepIds": [
|
|
"d3f981a3-7782-49a8-901b-5103f3c6317f"
|
|
]
|
|
},
|
|
"19928fa5-ddd3-422d-8617-7f4b84e33ba7": {
|
|
"simStepIds": [
|
|
"d351ce27-af6c-4deb-b663-45e7cdc3a807"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "TestClient, pytest, dependency_overrides",
|
|
"generationPrompt": "Test API endpoints easily using a provided test client",
|
|
"generationKeywords": "TestClient, pytest, dependency_overrides"
|
|
},
|
|
"Organize large codebases into modules using routers": {
|
|
"name": "Organize large codebases into modules using routers",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "d50816dd-f2a3-4fa9-8fb5-ef6a35151ca6",
|
|
"diagramNodeId": "603b4eb9-d4e5-4d23-b806-e5d29565c715",
|
|
"simStepLabel": "Define User-Related Routes",
|
|
"simStepDescription": "In a dedicated module `users.py`, an `APIRouter` instance is created to group user-related endpoints. Path operations, like a GET endpoint to read users, are defined on this router using decorators. This promotes code modularity.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/routers/users.py",
|
|
"startLine": "3",
|
|
"endLine": "8",
|
|
"relevantVariables": [
|
|
"router",
|
|
"APIRouter",
|
|
"read_users"
|
|
]
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{\"router_object\": \"APIRouter instance for users\", \"registered_routes\": [{\"path\": \"/users/\", \"methods\": [\"GET\"], \"tags\": [\"users\"]}]}"
|
|
},
|
|
{
|
|
"simStepId": "d38d244e-dd81-47db-a290-4b9d16b30792",
|
|
"diagramNodeId": "39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"simStepLabel": "User Router Object Created",
|
|
"simStepDescription": "The `router` object from `users.py`, now containing the `/users/` endpoint definition, is exported from its module, making it available for inclusion in the main application.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/routers/users.py",
|
|
"startLine": "3",
|
|
"endLine": "3",
|
|
"relevantVariables": [
|
|
"router"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"router_object\": \"APIRouter instance for users\", \"registered_routes\": [{\"path\": \"/users/\", \"methods\": [\"GET\"], \"tags\": [\"users\"]}]}",
|
|
"outputDataExample": "{\"router_object\": \"APIRouter instance for users\", \"registered_routes\": [{\"path\": \"/users/\", \"methods\": [\"GET\"], \"tags\": [\"users\"]}]}"
|
|
},
|
|
{
|
|
"simStepId": "e0b88502-55e5-4b9c-a970-9b325ed8a8e2",
|
|
"diagramNodeId": "f9a14e30-e10d-4e53-a595-158cce2646a0",
|
|
"simStepLabel": "Define Item Router with Shared Configuration",
|
|
"simStepDescription": "Similarly, in `items.py`, another `APIRouter` is created. This time, it's configured with shared parameters like a URL `prefix` ('/items'), `tags`, `dependencies`, and default `responses` that will apply to all path operations defined within this router.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/routers/items.py",
|
|
"startLine": "5",
|
|
"endLine": "10",
|
|
"relevantVariables": [
|
|
"router",
|
|
"APIRouter",
|
|
"get_token_header"
|
|
]
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{\"router_object\": \"APIRouter instance for items\", \"prefix\": \"/items\", \"tags\": [\"items\"], \"dependencies\": [\"Depends(get_token_header)\"]}"
|
|
},
|
|
{
|
|
"simStepId": "798e0b67-70cc-409b-9f66-4f20967121b6",
|
|
"diagramNodeId": "eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"simStepLabel": "Item Router Object Created",
|
|
"simStepDescription": "The configured `router` object from `items.py` is exported. It encapsulates the shared configuration and its own defined routes, ready to be included in the main application.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/routers/items.py",
|
|
"startLine": "5",
|
|
"endLine": "5",
|
|
"relevantVariables": [
|
|
"router"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"router_object\": \"APIRouter instance for items\", \"prefix\": \"/items\", \"tags\": [\"items\"], \"dependencies\": [\"Depends(get_token_header)\"]}",
|
|
"outputDataExample": "{\"router_object\": \"APIRouter instance for items\", \"prefix\": \"/items\", \"tags\": [\"items\"], \"dependencies\": [\"Depends(get_token_header)\"]}"
|
|
},
|
|
{
|
|
"simStepId": "99aeff6f-e85d-4990-8fbd-3ebab1aa05fe",
|
|
"diagramNodeId": "906297f0-cfb7-4c0f-b6cf-47ee77938360",
|
|
"simStepLabel": "Create Main FastAPI Application",
|
|
"simStepDescription": "In the main application file, `main.py`, an instance of the `FastAPI` class is created. This `app` object will serve as the central point for the entire web application, aggregating all the modular routers.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/main.py",
|
|
"startLine": "8",
|
|
"endLine": "8",
|
|
"relevantVariables": [
|
|
"app",
|
|
"FastAPI"
|
|
]
|
|
},
|
|
"inputDataExample": "{}",
|
|
"outputDataExample": "{\"app_object\": \"FastAPI instance\", \"routes\": []}"
|
|
},
|
|
{
|
|
"simStepId": "9afe704a-5961-478e-92ca-d07b76735226",
|
|
"diagramNodeId": "5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"simStepLabel": "App Instance Ready for Routers",
|
|
"simStepDescription": "The main `FastAPI` app instance is now initialized and ready to have modular routers included into its routing system.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/main.py",
|
|
"startLine": "4",
|
|
"endLine": "5",
|
|
"relevantVariables": [
|
|
"items",
|
|
"users"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app_object\": \"FastAPI instance\", \"routes\": []}",
|
|
"outputDataExample": "{\"app_object\": \"FastAPI instance\", \"routes\": []}"
|
|
},
|
|
{
|
|
"simStepId": "cfcc3244-3cb4-40fc-9208-ebe7d0feac88",
|
|
"diagramNodeId": "4007f37b-ba49-4437-918a-380bc8859f5a",
|
|
"simStepLabel": "Include Routers into the Main App",
|
|
"simStepDescription": "The `app.include_router()` method is called for each imported router (`users.router`, `items.router`). This method is the key to combining the modularized endpoints into the main application.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/main.py",
|
|
"startLine": "11",
|
|
"endLine": "12",
|
|
"relevantVariables": [
|
|
"app.include_router",
|
|
"users.router",
|
|
"items.router"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app_object\": \"FastAPI instance\", \"routers_to_include\": [\"users.router\", \"items.router\"]}",
|
|
"outputDataExample": "{\"app_object\": \"FastAPI instance\", \"routes\": [\"...routes from users and items...\"]}"
|
|
},
|
|
{
|
|
"simStepId": "1568332d-f98c-4c7f-a8d6-83920b8356f6",
|
|
"diagramNodeId": "c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"simStepLabel": "Delegate Router Inclusion",
|
|
"simStepDescription": "The `FastAPI.include_router()` method delegates the core logic to its internal `APIRouter` instance, passing along the router to be included and any specified parameters like `prefix` or `tags`.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1519",
|
|
"endLine": "1532",
|
|
"relevantVariables": [
|
|
"self.router.include_router",
|
|
"router",
|
|
"prefix",
|
|
"tags"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"router_to_include\": \"users.router\", \"prefix\": \"\", \"tags\": []}",
|
|
"outputDataExample": "{\"router_to_include\": \"users.router\", \"prefix\": \"\", \"tags\": []}"
|
|
},
|
|
{
|
|
"simStepId": "ddd8a50b-d021-4486-a599-9cee3495e6e8",
|
|
"diagramNodeId": "02519ecd-f449-46a3-8430-6cf6760a4263",
|
|
"simStepLabel": "Process and Add Routes to Main App",
|
|
"simStepDescription": "The core logic inside `APIRouter.include_router` iterates through each route from the provided router. It combines the `prefix` from the `include_router` call with the route's own path, and merges tags, dependencies, and responses before adding the final, fully-configured route to the main application's routing table.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "1348",
|
|
"endLine": "1383",
|
|
"relevantVariables": [
|
|
"router.routes",
|
|
"route",
|
|
"prefix",
|
|
"self.add_api_route"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"main_router\": \"app.router\", \"router_to_add\": \"users.router\", \"prefix\": \"\", \"tags\": []}",
|
|
"outputDataExample": "{\"main_router\": \"app.router with added routes\"}"
|
|
},
|
|
{
|
|
"simStepId": "8665befb-71e3-427e-b910-b262610cd999",
|
|
"diagramNodeId": "28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"simStepLabel": "Application Routes Updated",
|
|
"simStepDescription": "The routing table of the main application is now populated with the endpoints from the included routers. Paths are correctly prefixed, and all configurations are merged.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "1377",
|
|
"endLine": "1383",
|
|
"relevantVariables": [
|
|
"self.add_api_route"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app_routes_before\": []}",
|
|
"outputDataExample": "{\"app_routes_after\": [{\"path\": \"/users/\", \"methods\": [\"GET\"]}, {\"path\": \"/items/\", \"methods\": [\"GET\"]}]}"
|
|
},
|
|
{
|
|
"simStepId": "7e887cf3-4cfc-48ab-b9c7-40c2883d8138",
|
|
"diagramNodeId": "da65836d-fde5-450b-a63f-8856ed4ef131",
|
|
"simStepLabel": "Include Router with Overriding Configuration",
|
|
"simStepDescription": "A third router, `admin.router`, is included. This time, the `app.include_router` call provides a `prefix`, `tags`, and `dependencies`. This demonstrates how to apply app-specific configurations to a generic, reusable router without modifying its source code.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/main.py",
|
|
"startLine": "13",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"app.include_router",
|
|
"admin.router",
|
|
"prefix",
|
|
"tags",
|
|
"dependencies"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"router_to_include\": \"admin.router\", \"overrides\": {\"prefix\": \"/admin\", \"tags\": [\"admin\"]}}",
|
|
"outputDataExample": "{\"app_routes_after\": [{\"path\": \"/admin/\", \"methods\": [\"POST\"], \"tags\": [\"admin\"]}]}"
|
|
},
|
|
{
|
|
"simStepId": "6d4cbbc2-b965-461f-a2b8-64c5a0f13459",
|
|
"diagramNodeId": "",
|
|
"simStepLabel": "Final Application Ready",
|
|
"simStepDescription": "The application is now fully constructed with all routes from all modules. When a request comes in, the main FastAPI router will match the request path against the final, combined routing table, which includes routes from the users, items, and admin modules with all prefixes and configurations correctly applied.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/bigger_applications/app/main.py",
|
|
"startLine": "8",
|
|
"endLine": "23",
|
|
"relevantVariables": [
|
|
"app"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"app_state\": \"building\"}",
|
|
"outputDataExample": "{\"app_state\": \"ready_to_serve\", \"routing_table\": {\"/users/\": \"read_users\", \"/items/\": \"read_items\", \"/admin/\": \"update_admin\"}}"
|
|
}
|
|
],
|
|
"description": "<ul><li>For building large, maintainable applications, FastAPI offers the <code>APIRouter</code> class</li><li>It allows developers to group related API endpoints into separate modules or files</li><li>These routers can then be included in the main application, optionally with a URL prefix, common tags, or shared dependencies</li><li>This feature is essential for promoting code organization and scalability in bigger projects</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"603b4eb9-d4e5-4d23-b806-e5d29565c715": {
|
|
"simStepIds": [
|
|
"d50816dd-f2a3-4fa9-8fb5-ef6a35151ca6"
|
|
]
|
|
},
|
|
"f9a14e30-e10d-4e53-a595-158cce2646a0": {
|
|
"simStepIds": [
|
|
"e0b88502-55e5-4b9c-a970-9b325ed8a8e2"
|
|
]
|
|
},
|
|
"906297f0-cfb7-4c0f-b6cf-47ee77938360": {
|
|
"simStepIds": [
|
|
"99aeff6f-e85d-4990-8fbd-3ebab1aa05fe"
|
|
]
|
|
},
|
|
"4007f37b-ba49-4437-918a-380bc8859f5a": {
|
|
"simStepIds": [
|
|
"cfcc3244-3cb4-40fc-9208-ebe7d0feac88"
|
|
]
|
|
},
|
|
"02519ecd-f449-46a3-8430-6cf6760a4263": {
|
|
"simStepIds": [
|
|
"ddd8a50b-d021-4486-a599-9cee3495e6e8"
|
|
]
|
|
},
|
|
"da65836d-fde5-450b-a63f-8856ed4ef131": {
|
|
"simStepIds": [
|
|
"7e887cf3-4cfc-48ab-b9c7-40c2883d8138"
|
|
]
|
|
},
|
|
"39f855f0-2d15-4865-90bf-cce2d20bb759": {
|
|
"simStepIds": [
|
|
"d38d244e-dd81-47db-a290-4b9d16b30792"
|
|
]
|
|
},
|
|
"eff4590a-a5ea-4a00-b6ff-d997c92439f0": {
|
|
"simStepIds": [
|
|
"798e0b67-70cc-409b-9f66-4f20967121b6"
|
|
]
|
|
},
|
|
"5e1e692a-53ef-4b61-9274-643796cecc8e": {
|
|
"simStepIds": [
|
|
"9afe704a-5961-478e-92ca-d07b76735226"
|
|
]
|
|
},
|
|
"c3e08f7d-6ac8-4d7e-ab26-246ab6656e99": {
|
|
"simStepIds": [
|
|
"1568332d-f98c-4c7f-a8d6-83920b8356f6"
|
|
]
|
|
},
|
|
"28e77bbc-acde-44e2-9e00-47f86912cb89": {
|
|
"simStepIds": [
|
|
"8665befb-71e3-427e-b910-b262610cd999"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "APIRouter, include_router, prefix",
|
|
"generationPrompt": "Organize large codebases into modules using routers",
|
|
"generationKeywords": "APIRouter, include_router, prefix"
|
|
},
|
|
"Robust error handling with custom exception handlers": {
|
|
"name": "Robust error handling with custom exception handlers",
|
|
"simSteps": [
|
|
{
|
|
"simStepId": "215fc83a-81b9-4126-98aa-43ceba5fd293",
|
|
"diagramNodeId": "cc96ff59-f849-4fc3-8c77-3c015a9af800",
|
|
"simStepLabel": "Flow 1: Path Operation Raises HTTPException",
|
|
"simStepDescription": "A client requests an item with an ID that triggers a specific business logic error. The application logic checks for this condition (e.g., a specific item ID is disallowed) and raises an `HTTPException` to immediately stop processing and return a specific HTTP error.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial001.py",
|
|
"startLine": "11",
|
|
"endLine": "12",
|
|
"relevantVariables": [
|
|
"read_item",
|
|
"HTTPException"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"/items/3\"}",
|
|
"outputDataExample": "{\"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}"
|
|
},
|
|
{
|
|
"simStepId": "3196e6b3-136a-4043-a63b-6cb5111f76c4",
|
|
"diagramNodeId": "4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"simStepLabel": "Flow 1: Exception Propagation",
|
|
"simStepDescription": "The raised `HTTPException` propagates up the call stack from the path operation function. It is not handled by a standard `try...except` block within the application code, allowing it to be caught by FastAPI's higher-level exception handling middleware.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "363",
|
|
"endLine": "365",
|
|
"relevantVariables": [
|
|
"HTTPException"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"type\": \"HTTPException\", \"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}",
|
|
"outputDataExample": "{\"type\": \"HTTPException\", \"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}"
|
|
},
|
|
{
|
|
"simStepId": "b16094b3-792f-4a5b-aa82-614601c2e75c",
|
|
"diagramNodeId": "dc65b6d2-aebe-4270-a674-6ac2fb83c227",
|
|
"simStepLabel": "Flow 1: Default Exception Handler Invoked",
|
|
"simStepDescription": "FastAPI's internal `ExceptionMiddleware` catches the `HTTPException`. It looks up the registered handler for this exception type, which, by default, is FastAPI's built-in `http_exception_handler`.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "981",
|
|
"endLine": "982",
|
|
"relevantVariables": [
|
|
"self.exception_handlers",
|
|
"HTTPException",
|
|
"http_exception_handler"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/3\"}, \"exception\": {\"type\": \"HTTPException\", \"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}}",
|
|
"outputDataExample": "{\"handler\": \"http_exception_handler\"}"
|
|
},
|
|
{
|
|
"simStepId": "e64de2a8-6902-48ca-9640-98ac713f199a",
|
|
"diagramNodeId": "fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"simStepLabel": "Flow 1: Data Passed to Handler",
|
|
"simStepDescription": "The middleware passes the `request` object and the `exception` object to the located handler function for processing.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1014",
|
|
"endLine": "1014",
|
|
"relevantVariables": [
|
|
"ExceptionMiddleware"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/3\"}, \"exception\": {\"type\": \"HTTPException\", \"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}}",
|
|
"outputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/3\"}, \"exception\": {\"type\": \"HTTPException\", \"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}}"
|
|
},
|
|
{
|
|
"simStepId": "add0b602-fe90-4174-9cd5-e6b9f89a0144",
|
|
"diagramNodeId": "326d1002-39bf-4422-8057-7ba0a4bdd024",
|
|
"simStepLabel": "Flow 1: Default Handler Creates JSON Response",
|
|
"simStepDescription": "The `http_exception_handler` function takes the status code and detail from the exception object and formats them into a standard `JSONResponse`, ensuring a consistent error structure for the client.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/exception_handlers.py",
|
|
"startLine": "10",
|
|
"endLine": "16",
|
|
"relevantVariables": [
|
|
"http_exception_handler",
|
|
"JSONResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/3\"}, \"exc\": {\"type\": \"HTTPException\", \"status_code\": 418, \"detail\": \"Nope! I don't like 3.\"}}",
|
|
"outputDataExample": "{\"status_code\": 418, \"headers\": {\"content-type\": \"application/json\"}, \"body\": \"{\\\"detail\\\":\\\"Nope! I don't like 3.\\\"}\"}"
|
|
},
|
|
{
|
|
"simStepId": "d42f179f-3990-4e75-a858-54d473837db3",
|
|
"diagramNodeId": "458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"simStepLabel": "Flow 1: Transmit Final HTTP Error Response",
|
|
"simStepDescription": "The generated `JSONResponse` is sent back through the ASGI server to the client, completing the request-response cycle with a formatted error message and the appropriate HTTP status code.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/exception_handlers.py",
|
|
"startLine": "14",
|
|
"endLine": "16",
|
|
"relevantVariables": [
|
|
"JSONResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"status_code\": 418, \"headers\": {\"content-type\": \"application/json\"}, \"body\": \"{\\\"detail\\\":\\\"Nope! I don't like 3.\\\"}\"}",
|
|
"outputDataExample": "{\"status_code\": 418, \"headers\": {\"content-type\": \"application/json\"}, \"body\": \"{\\\"detail\\\":\\\"Nope! I don't like 3.\\\"}\"}"
|
|
},
|
|
{
|
|
"simStepId": "67f98fe6-fc9a-4d2a-9d93-c141e1662671",
|
|
"diagramNodeId": "aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a",
|
|
"simStepLabel": "Flow 2: Invalid Request Data Received",
|
|
"simStepDescription": "A client sends a request to an endpoint where a path parameter is expected to be an integer, but a string is provided. For example, a GET request to `/items/foo`.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial004.py",
|
|
"startLine": "22",
|
|
"endLine": "22",
|
|
"relevantVariables": [
|
|
"read_item",
|
|
"item_id: int"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"/items/foo\"}",
|
|
"outputDataExample": "null"
|
|
},
|
|
{
|
|
"simStepId": "e60d5731-fd37-4e6b-a775-849fe7024e2c",
|
|
"diagramNodeId": "e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"simStepLabel": "Flow 2: Data Validation Fails",
|
|
"simStepDescription": "FastAPI's routing layer attempts to parse and validate the incoming path parameter `foo` against the declared type hint `int`. The validation fails because 'foo' cannot be converted to an integer.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "419",
|
|
"endLine": "425",
|
|
"relevantVariables": [
|
|
"solve_dependencies",
|
|
"errors"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"path_param\": \"foo\", \"expected_type\": \"int\"}",
|
|
"outputDataExample": "{\"error_type\": \"type_error.integer\", \"location\": [\"path\", \"item_id\"], \"message\": \"value is not a valid integer\"}"
|
|
},
|
|
{
|
|
"simStepId": "4d9c03e8-d9ae-4e75-ad27-a5030492d468",
|
|
"diagramNodeId": "a3ba77cb-c744-499b-96cc-aac2b755d957",
|
|
"simStepLabel": "Flow 2: FastAPI Raises RequestValidationError",
|
|
"simStepDescription": "After collecting all validation failures, FastAPI internally raises a `RequestValidationError`, which encapsulates detailed information about each error, including its location and type.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/routing.py",
|
|
"startLine": "426",
|
|
"endLine": "429",
|
|
"relevantVariables": [
|
|
"RequestValidationError",
|
|
"validation_error"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"errors\": [{\"loc\": [\"path\", \"item_id\"], \"msg\": \"value is not a valid integer\", \"type\": \"type_error.integer\"}], \"body\": null}",
|
|
"outputDataExample": "{\"exception\": \"RequestValidationError\", \"details\": \"1 validation error for Request...\"}"
|
|
},
|
|
{
|
|
"simStepId": "82b45422-fa0f-4098-8a60-ce7053307d29",
|
|
"diagramNodeId": "41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"simStepLabel": "Flow 2: Exception Caught by Middleware",
|
|
"simStepDescription": "The `RequestValidationError` propagates up to the `ExceptionMiddleware`, which is responsible for routing exceptions to their corresponding handlers.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1012",
|
|
"endLine": "1015",
|
|
"relevantVariables": [
|
|
"ExceptionMiddleware"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"exception\": \"RequestValidationError\", \"details\": \"1 validation error for Request...\"}",
|
|
"outputDataExample": "{\"exception\": \"RequestValidationError\", \"details\": \"1 validation error for Request...\"}"
|
|
},
|
|
{
|
|
"simStepId": "38f93061-0b96-4fab-9004-8523f30d77c2",
|
|
"diagramNodeId": "89c7b37c-31a9-4b7c-8152-a69518ca096e",
|
|
"simStepLabel": "Flow 2: Default Validation Handler Creates Response",
|
|
"simStepDescription": "The middleware invokes the default handler for validation errors, `request_validation_exception_handler`. This handler formats the error details into a structured JSON object with a 422 Unprocessable Entity status code.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/exception_handlers.py",
|
|
"startLine": "19",
|
|
"endLine": "25",
|
|
"relevantVariables": [
|
|
"request_validation_exception_handler",
|
|
"jsonable_encoder",
|
|
"JSONResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/foo\"}, \"exc\": {\"type\": \"RequestValidationError\", \"errors\": [...]}}",
|
|
"outputDataExample": "{\"status_code\": 422, \"content\": {\"detail\": [{\"loc\": [\"path\", \"item_id\"], \"msg\": \"value is not a valid integer\", \"type\": \"type_error.integer\"}]}}"
|
|
},
|
|
{
|
|
"simStepId": "fe0f4226-4f2b-40e8-9444-b781c0208ccf",
|
|
"diagramNodeId": "23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"simStepLabel": "Flow 2: Transmit Final Validation Error Response",
|
|
"simStepDescription": "The 422 JSON response is sent to the client, providing a clear and machine-readable explanation of the validation failure.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/exception_handlers.py",
|
|
"startLine": "22",
|
|
"endLine": "25",
|
|
"relevantVariables": [
|
|
"JSONResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"status_code\": 422, \"body\": \"{\\\"detail\\\":[{\\\"loc\\\":[\\\"path\\\",\\\"item_id\\\"],\\\"msg\\\":\\\"value is not a valid integer\\\",\\\"type\\\":\\\"type_error.integer\\\"}]}\"}",
|
|
"outputDataExample": "{\"status_code\": 422, \"body\": \"{\\\"detail\\\":[{\\\"loc\\\":[\\\"path\\\",\\\"item_id\\\"],\\\"msg\\\":\\\"value is not a valid integer\\\",\\\"type\\\":\\\"type_error.integer\\\"}]}\"}"
|
|
},
|
|
{
|
|
"simStepId": "fead7102-4576-468b-b4c4-d7f7d3d02160",
|
|
"diagramNodeId": "ca47235c-5df6-4452-a574-2e6e3aa67b1b",
|
|
"simStepLabel": "Flow 3: Define and Register Custom Handlers",
|
|
"simStepDescription": "During application setup, a developer defines custom functions to handle specific exceptions. The `@app.exception_handler` decorator registers these functions, overriding FastAPI's default handlers for `HTTPException` and `RequestValidationError`.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial004.py",
|
|
"startLine": "9",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"@app.exception_handler",
|
|
"StarletteHTTPException",
|
|
"RequestValidationError",
|
|
"http_exception_handler",
|
|
"validation_exception_handler"
|
|
]
|
|
},
|
|
"inputDataExample": "null",
|
|
"outputDataExample": "{\"app.exception_handlers\": {\"StarletteHTTPException\": \"custom_http_handler\", \"RequestValidationError\": \"custom_validation_handler\"}}"
|
|
},
|
|
{
|
|
"simStepId": "1ae38365-5b41-4aa8-b6a4-51eac6888b15",
|
|
"diagramNodeId": "f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"simStepLabel": "Flow 3: Exception Triggered and Caught",
|
|
"simStepDescription": "A request is made that triggers an exception (e.g., GET `/items/foo` triggers `RequestValidationError`). The exception propagates up to the `ExceptionMiddleware` as in the previous flows.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "fastapi/applications.py",
|
|
"startLine": "1012",
|
|
"endLine": "1015",
|
|
"relevantVariables": [
|
|
"ExceptionMiddleware"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"method\": \"GET\", \"url\": \"/items/foo\"}",
|
|
"outputDataExample": "{\"exception\": \"RequestValidationError\", \"details\": \"1 validation error for Request...\"}"
|
|
},
|
|
{
|
|
"simStepId": "c95e0d66-70bd-4d66-a616-cfe44a6b3131",
|
|
"diagramNodeId": "2fac3163-54f8-456c-890c-17c6430e406d",
|
|
"simStepLabel": "Flow 3: Custom Handler is Invoked",
|
|
"simStepDescription": "The `ExceptionMiddleware` finds the developer-registered handler instead of the default one. It invokes the custom `validation_exception_handler`, passing it the request and the exception.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial004.py",
|
|
"startLine": "15",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"validation_exception_handler",
|
|
"PlainTextResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/foo\"}, \"exc\": {\"type\": \"RequestValidationError\", \"errors\": [...]}}",
|
|
"outputDataExample": "{\"response\": \"PlainTextResponse\", \"status_code\": 400, \"content\": \"1 validation error for Request...\"}"
|
|
},
|
|
{
|
|
"simStepId": "309cd2cd-9347-451f-880b-4ab7502a1b6b",
|
|
"diagramNodeId": "f63e7186-ed41-432f-b2f3-4ede5013e529",
|
|
"simStepLabel": "Flow 3: Delegate to Default Handler (Reuse Pattern)",
|
|
"simStepDescription": "Alternatively, a custom handler can perform an action (like logging) and then delegate back to the default handler by importing and calling it. This allows for adding functionality without completely replacing the default behavior.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial006.py",
|
|
"startLine": "21",
|
|
"endLine": "21",
|
|
"relevantVariables": [
|
|
"request_validation_exception_handler"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/foo\"}, \"exc\": {\"type\": \"RequestValidationError\", \"errors\": [...]}}",
|
|
"outputDataExample": "{\"request\": {\"method\": \"GET\", \"url\": \"/items/foo\"}, \"exc\": {\"type\": \"RequestValidationError\", \"errors\": [...]}}"
|
|
},
|
|
{
|
|
"simStepId": "f8ecd5a4-aee3-42bf-9e54-d44c44d550ee",
|
|
"diagramNodeId": "4422434a-fd9d-4a7f-bae3-d67280e39a7e",
|
|
"simStepLabel": "Flow 3: Custom Response is Generated",
|
|
"simStepDescription": "The custom handler's logic is executed. In this case, it converts the exception to a string and returns a `PlainTextResponse` with a 400 status code, differing from the default 422 JSON response.",
|
|
"isEdge": 0,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial004.py",
|
|
"startLine": "17",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"exc",
|
|
"PlainTextResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"exc\": {\"type\": \"RequestValidationError\", \"errors\": [...]}}",
|
|
"outputDataExample": "{\"status_code\": 400, \"headers\": {\"content-type\": \"text/plain; charset=utf-8\"}, \"body\": \"1 validation error for Request...\"}"
|
|
},
|
|
{
|
|
"simStepId": "055983ff-db25-44e1-a6dc-8aaa566b93e5",
|
|
"diagramNodeId": "",
|
|
"simStepLabel": "Flow 3: Transmit Custom Error Response",
|
|
"simStepDescription": "The unique response created by the custom handler (a plain text response) is sent back to the client, demonstrating the successful override of the default error handling mechanism.",
|
|
"isEdge": 1,
|
|
"sourceCodeMapping": {
|
|
"filePath": "docs_src/handling_errors/tutorial004.py",
|
|
"startLine": "18",
|
|
"endLine": "18",
|
|
"relevantVariables": [
|
|
"PlainTextResponse"
|
|
]
|
|
},
|
|
"inputDataExample": "{\"status_code\": 400, \"headers\": {\"content-type\": \"text/plain; charset=utf-8\"}, \"body\": \"1 validation error for Request...\"}",
|
|
"outputDataExample": "{\"status_code\": 400, \"headers\": {\"content-type\": \"text/plain; charset=utf-8\"}, \"body\": \"1 validation error for Request...\"}"
|
|
}
|
|
],
|
|
"description": "<ul><li>FastAPI has a comprehensive system for handling errors</li><li>It automatically catches and formats validation errors into a clear JSON response</li><li>For application-specific errors, developers can raise an <code>HTTPException</code> to immediately send a specific HTTP status code and error detail to the client</li><li>Furthermore, it's possible to install custom exception handlers to define global error handling logic for any type of exception, ensuring consistent and predictable error responses</li></ul>",
|
|
"simulationNodesAndEdges": {
|
|
"cc96ff59-f849-4fc3-8c77-3c015a9af800": {
|
|
"simStepIds": [
|
|
"215fc83a-81b9-4126-98aa-43ceba5fd293"
|
|
]
|
|
},
|
|
"dc65b6d2-aebe-4270-a674-6ac2fb83c227": {
|
|
"simStepIds": [
|
|
"b16094b3-792f-4a5b-aa82-614601c2e75c"
|
|
]
|
|
},
|
|
"326d1002-39bf-4422-8057-7ba0a4bdd024": {
|
|
"simStepIds": [
|
|
"add0b602-fe90-4174-9cd5-e6b9f89a0144"
|
|
]
|
|
},
|
|
"aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a": {
|
|
"simStepIds": [
|
|
"67f98fe6-fc9a-4d2a-9d93-c141e1662671"
|
|
]
|
|
},
|
|
"a3ba77cb-c744-499b-96cc-aac2b755d957": {
|
|
"simStepIds": [
|
|
"4d9c03e8-d9ae-4e75-ad27-a5030492d468"
|
|
]
|
|
},
|
|
"89c7b37c-31a9-4b7c-8152-a69518ca096e": {
|
|
"simStepIds": [
|
|
"38f93061-0b96-4fab-9004-8523f30d77c2"
|
|
]
|
|
},
|
|
"ca47235c-5df6-4452-a574-2e6e3aa67b1b": {
|
|
"simStepIds": [
|
|
"fead7102-4576-468b-b4c4-d7f7d3d02160"
|
|
]
|
|
},
|
|
"2fac3163-54f8-456c-890c-17c6430e406d": {
|
|
"simStepIds": [
|
|
"c95e0d66-70bd-4d66-a616-cfe44a6b3131"
|
|
]
|
|
},
|
|
"4422434a-fd9d-4a7f-bae3-d67280e39a7e": {
|
|
"simStepIds": [
|
|
"f8ecd5a4-aee3-42bf-9e54-d44c44d550ee"
|
|
]
|
|
},
|
|
"4228354c-d857-427e-a55e-eae5cc0a0406": {
|
|
"simStepIds": [
|
|
"3196e6b3-136a-4043-a63b-6cb5111f76c4"
|
|
]
|
|
},
|
|
"fc2d073c-7206-4740-9d83-f258184c8226": {
|
|
"simStepIds": [
|
|
"e64de2a8-6902-48ca-9640-98ac713f199a"
|
|
]
|
|
},
|
|
"458cb68b-a494-4b53-adf8-5d96d8d30f6f": {
|
|
"simStepIds": [
|
|
"d42f179f-3990-4e75-a858-54d473837db3"
|
|
]
|
|
},
|
|
"e4285640-4dfa-4273-ac7a-81d5752548d0": {
|
|
"simStepIds": [
|
|
"e60d5731-fd37-4e6b-a775-849fe7024e2c"
|
|
]
|
|
},
|
|
"41851979-7fc5-43e6-a100-0ee9357cb22a": {
|
|
"simStepIds": [
|
|
"82b45422-fa0f-4098-8a60-ce7053307d29"
|
|
]
|
|
},
|
|
"23811991-d36d-4f07-8537-26065c5d3a44": {
|
|
"simStepIds": [
|
|
"fe0f4226-4f2b-40e8-9444-b781c0208ccf"
|
|
]
|
|
},
|
|
"f264e35a-3ede-4cd4-a4f3-5468def4eef0": {
|
|
"simStepIds": [
|
|
"1ae38365-5b41-4aa8-b6a4-51eac6888b15"
|
|
]
|
|
},
|
|
"f63e7186-ed41-432f-b2f3-4ede5013e529": {
|
|
"simStepIds": [
|
|
"309cd2cd-9347-451f-880b-4ab7502a1b6b"
|
|
]
|
|
}
|
|
},
|
|
"isAIGenerated": true,
|
|
"keywords": "HTTPException, exception_handlers, RequestValidationError",
|
|
"generationPrompt": "Robust error handling with custom exception handlers",
|
|
"generationKeywords": "HTTPException, exception_handlers, RequestValidationError"
|
|
}
|
|
},
|
|
"cellToPath": {
|
|
"14b2cbb7-2b14-4ed5-bee3-bd64cbea747e": "docs_src",
|
|
"e3327eea-4b00-4760-81fc-439223e65b7b": "fastapi",
|
|
"155fc4f9-e909-433d-bb96-a4501896f906": "docs_src/first_steps",
|
|
"8b330f7a-5ce6-4249-954b-560570e6efab": "docs_src/bigger_applications",
|
|
"7f6f82df-82d2-40de-96d9-e51093e8ee57": "fastapi/applications.py",
|
|
"bc147214-42a2-42c3-a92c-ed7b8996b912": "fastapi/routing.py",
|
|
"ff477659-d236-42a7-8bca-c39417c94ba3": "docs_src/first_steps/tutorial001.py",
|
|
"ced0be04-1104-44cf-9102-bd03eb76b5fc": "docs_src/bigger_applications/app",
|
|
"24b16353-49e5-4230-9464-c645c55926e0": "docs_src/bigger_applications/app/routers",
|
|
"8f4c6c49-0848-4c53-942f-8faa44426856": "docs_src/bigger_applications/app/main.py",
|
|
"26a92877-c137-468e-a7e8-766790d0a44c": "docs_src/bigger_applications/app/routers/users.py",
|
|
"2b5e7ff6-1868-48b8-9702-5e22aafa2516": "docs_src/first_steps/tutorial001.py-simstep-ff8b011f-3cc3-4fa8-b840-55265541b8ed",
|
|
"6e05ecc7-7adb-4cc0-907f-c9cd89754215": "fastapi/applications.py-simstep-a8cc3103-1ef7-444f-90c8-59f602cdbfe2",
|
|
"926aa4a2-9860-4054-a8d3-58d1bad36a26": "docs_src/bigger_applications/app/routers/users.py-simstep-f60e1194-8deb-4b13-8401-2f7d4d59e025",
|
|
"a4a492b6-cd0a-4b76-a068-6332c88f2780": "fastapi/applications.py-simstep-f71efd59-5861-469f-960a-f56a9b57277d",
|
|
"dd216165-e20a-4b31-93da-09fce6984f69": "generated-edge-simstep-5b2746fd-6e75-4f21-949e-e9ee37f16d2d-dd216165-e20a-4b31-93da-09fce6984f69",
|
|
"e898f902-e975-496a-838f-6754c642f66b": "generated-edge-simstep-d731c9cf-f665-4c13-b695-5b975262c68a-e898f902-e975-496a-838f-6754c642f66b",
|
|
"1927fc0e-1179-4fce-a035-5aea887fce02": "generated-edge-simstep-f941cc6e-ebc5-4ebd-8b5e-fefc2ddf5f1c-1927fc0e-1179-4fce-a035-5aea887fce02",
|
|
"1ba21140-0832-45ce-9c42-8dceb9ee9610": "docs_src/body",
|
|
"a107d9fc-610a-46cb-b276-e20da1ef1d7f": "docs_src/response_model",
|
|
"0815c268-f8f0-4bad-b217-7340208c9b09": "fastapi/dependencies",
|
|
"cf9f8228-b360-4073-ad8a-031b4bfb5b8a": "docs_src/body/tutorial001.py",
|
|
"07829d93-9e93-4a1f-8c08-721c2e82ec45": "docs_src/response_model/tutorial003.py",
|
|
"e2b03226-2d96-4294-9d12-bf891b8cfcdc": "fastapi/dependencies/utils.py",
|
|
"4bb82a78-f30e-4b1c-a69e-164917cfc206": "docs_src/body/tutorial001.py-simstep-a7da901a-4a21-4bbc-8c8c-fc3dd6062628",
|
|
"e3b022ed-3b88-44a1-8ece-42671ec7f9d5": "fastapi/routing.py-simstep-c3e060a2-b0b5-481f-8d4f-084ff3a7793b",
|
|
"420c7ee9-0289-4e93-b419-d262eb649d89": "fastapi/dependencies/utils.py-simstep-8c8d65d3-8826-4fe3-af1a-67e092c3646b",
|
|
"d6492e72-b011-4de7-8256-7267f17c1ca3": "docs_src/response_model/tutorial003.py-simstep-21c062b5-2a70-4c9e-aa40-e5e388d8f9a2",
|
|
"bd740fd1-a54f-4634-81fc-78b0ed1642ad": "docs_src/response_model/tutorial003.py-simstep-41999094-9985-422a-85cb-4be9a109d7c6",
|
|
"4d193d20-5a44-4123-894a-3ee686cdc355": "fastapi/routing.py-simstep-e717de6c-aa13-4478-9d04-b1502a58bb10",
|
|
"ae365bbc-07ba-4f1e-8f09-c7aff7137d26": "generated-edge-simstep-f105906a-ab10-4431-ba14-80cdbe971f2f-ae365bbc-07ba-4f1e-8f09-c7aff7137d26",
|
|
"0eb5062e-0f9b-4eb4-b99e-3de4035a25a2": "generated-edge-simstep-4f3e5158-4d71-4281-86f9-7be02c5611cf-0eb5062e-0f9b-4eb4-b99e-3de4035a25a2",
|
|
"0ff0716f-03dd-4960-ab7c-76b74559d1f3": "generated-edge-simstep-fee61414-4b47-4301-a40c-841a44e11af6-0ff0716f-03dd-4960-ab7c-76b74559d1f3",
|
|
"650381df-eef9-40df-9b05-777389c18054": "generated-edge-simstep-1f27ba54-996c-48d8-86d9-1decb04741c5-650381df-eef9-40df-9b05-777389c18054",
|
|
"284b60e3-6fbd-4780-b433-8fc0fe8c7e28": "generated-edge-simstep-ef20d7e6-e76e-461a-8dbb-4d184eb2c685-284b60e3-6fbd-4780-b433-8fc0fe8c7e28",
|
|
"5fb160b4-d5c2-4517-8bef-8ea3c4c54a63": "fastapi/openapi",
|
|
"6b3b638b-dd28-4c47-a018-8f3d70052485": "fastapi/openapi/docs.py",
|
|
"da7e014f-3756-404b-8a5f-bca25d199862": "fastapi/openapi/utils.py",
|
|
"e4a59297-1264-44a9-898c-4dee94711ce9": "fastapi/applications.py-simstep-62559c5d-7c59-49cb-8dc0-eaded773a2c0",
|
|
"b71f1299-bb58-4dbf-af94-bfaf6109a6b6": "fastapi/openapi/docs.py-simstep-03f94017-eaa6-4187-94c1-cfa9035fad87",
|
|
"40a4dbed-c500-4e10-8576-a6a3c6e89f42": "fastapi/applications.py-simstep-3e7e3cf7-4f11-4281-9883-665713027cca",
|
|
"29279a4a-6028-4d0a-8e6e-5df871526243": "fastapi/openapi/docs.py-simstep-eceee8d4-49f5-4b41-9200-83ccec2c84e7",
|
|
"b7f04727-ddee-4e7f-aa93-9b248246cb43": "fastapi/applications.py-simstep-aaedfecc-bfc7-4d9e-82ca-6c437c8d572e",
|
|
"2709025c-1969-4906-a148-18d287b5aac5": "fastapi/openapi/docs.py-simstep-8aea22f4-b50d-4473-8c0c-fc36c9674074",
|
|
"a0ec126e-9261-47be-8bfd-46fe40ae350d": "fastapi/applications.py-simstep-faadf711-1fbb-4fc3-bef7-79a08dfdb574",
|
|
"c06cc146-1404-4651-9d20-e9bdb7a4cd50": "fastapi/openapi/docs.py-simstep-8cc0da97-9556-453f-bebd-835b2d04164c",
|
|
"c09eca71-295a-433a-ab27-2870cb096176": "generated-edge-simstep-198b9c8f-91a9-4bd8-81cd-9baf58501924-c09eca71-295a-433a-ab27-2870cb096176",
|
|
"8c03ffed-641c-4edb-86fd-8373f4400b75": "generated-edge-simstep-271f8b55-4ca5-45eb-bcbd-200744683192-8c03ffed-641c-4edb-86fd-8373f4400b75",
|
|
"8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89": "generated-edge-simstep-2382096f-c702-4b0e-8e88-3388794ce7cd-8e4ccd52-4a27-42e6-9c2a-d12f7beb7c89",
|
|
"d645b274-e798-4677-8ecd-0cfb23b2989c": "generated-edge-simstep-f949b2f6-b33e-48ff-86d9-3f1889c775a4-d645b274-e798-4677-8ecd-0cfb23b2989c",
|
|
"d145150d-7f0b-4c3e-a048-b16f23cb5c9b": "generated-edge-simstep-24ee0db5-8733-4165-9745-8de2709d88f5-d145150d-7f0b-4c3e-a048-b16f23cb5c9b",
|
|
"ee6a230a-6885-436e-9530-d36c032b611b": "generated-edge-simstep-54e37b0b-a5bd-4888-a766-a79e7bf60135-ee6a230a-6885-436e-9530-d36c032b611b",
|
|
"1eb93a60-c8ea-4e4d-b7eb-e427ae36ae0f": "docs_src/dependency_testing",
|
|
"2b02df7f-6022-4e24-9de1-76f9379fee9a": "docs_src/dependency_testing/tutorial001.py",
|
|
"f6bb6d10-45ca-4e81-871f-780dea9a7305": "fastapi/applications.py-simstep-6a06bcaa-1a73-4541-ac3a-ea66a2e77123",
|
|
"ffe256a7-70ab-40e0-b789-c9b6baaae7c3": "fastapi/routing.py-simstep-ed7142a9-d68b-4eff-882c-b64a5458d833",
|
|
"e72088ee-22e5-4463-b5ff-1eaafe569f93": "docs_src/dependency_testing/tutorial001.py-simstep-76b5449b-696e-4772-842a-e175d6ecfb48",
|
|
"7311e683-4633-41fe-94d6-cd7f59f20fc0": "fastapi/routing.py-simstep-05d78d9d-f843-4424-a0df-4114cd1d9542",
|
|
"90cec20b-7186-481b-9fc1-827b0f9b4c3d": "fastapi/dependencies/utils.py-simstep-f92f840f-e67d-4895-83e5-aea8cb53a6ad",
|
|
"1dcbd706-7009-42e5-81ad-8e2fea59e6a5": "fastapi/dependencies/utils.py-simstep-16e2c7a7-9f7c-49d3-be77-e2a2a4915fe6",
|
|
"149c1867-ad1b-4774-97a5-51df12cae15c": "fastapi/routing.py-simstep-104b9697-bfcb-4d7f-b645-f3d12fe39444",
|
|
"6f79803c-d6f1-4835-840a-8a90f70c549a": "generated-edge-simstep-8496aba1-ac04-49e4-8393-bbfbc6b21a3f-6f79803c-d6f1-4835-840a-8a90f70c549a",
|
|
"b6ef964f-2f6b-4548-96a8-c41ea9119862": "generated-edge-simstep-648bda8a-8ce0-4133-b872-b36a5c307222-b6ef964f-2f6b-4548-96a8-c41ea9119862",
|
|
"382e0121-cd55-4d6e-be07-8107e3074955": "generated-edge-simstep-cdd1be57-2fde-40a2-8b73-144a7dd9fa25-382e0121-cd55-4d6e-be07-8107e3074955",
|
|
"12b15e5e-0779-4c86-8f9b-ea73346f85ac": "generated-edge-simstep-f60a0dd4-d561-4be6-bc24-801785c90f57-12b15e5e-0779-4c86-8f9b-ea73346f85ac",
|
|
"a53196c6-51c7-4ad4-853c-6dddb4c94ed3": "generated-edge-simstep-59a5196a-fa0f-4e56-9631-e5e28f624c80-a53196c6-51c7-4ad4-853c-6dddb4c94ed3",
|
|
"997a4aa0-bbe7-4174-a011-df2b48d6dc0e": "generated-edge-simstep-c6e7c7e5-cc9a-4497-9c35-1d4df1a06057-997a4aa0-bbe7-4174-a011-df2b48d6dc0e",
|
|
"18cdfb57-624d-48d1-a684-e2ea2cc4267d": "docs_src/security",
|
|
"ea25c76d-337b-42df-85bd-c54190cafacf": "fastapi/security",
|
|
"06adf03b-ecd6-4392-a5eb-c8ef4f064794": "docs_src/security/tutorial002_an_py310.py",
|
|
"5c44eca9-f066-4266-b3c7-188264b65d9e": "fastapi/security/oauth2.py",
|
|
"75f350d9-2d38-490b-a819-4ca969223fcb": "docs_src/security/tutorial002_an_py310.py-simstep-331ce70f-4acc-4bdb-89da-3da66c565408",
|
|
"0d3536ce-f083-416f-9777-ab87be3805ba": "docs_src/security/tutorial002_an_py310.py-simstep-4d860027-f748-42b3-af9a-3e9f970b3feb",
|
|
"ff6b2c18-8425-40a6-b27e-a2a860a6448d": "fastapi/security/oauth2.py-simstep-93c669e0-5aa9-4df0-888d-a3da5e4371e3",
|
|
"8f262716-e919-4f69-9c85-095021269fa5": "docs_src/security/tutorial002_an_py310.py-simstep-6f7707ff-b3dd-40c5-9c4e-bf1effd6c651",
|
|
"65ee418b-cdcf-4852-b605-afa3d1f990aa": "docs_src/security/tutorial002_an_py310.py-simstep-8eeb8c1a-62a8-444b-ac96-5f5e3b355d26",
|
|
"253c3208-f450-42d2-9077-3f3ade4fcdaf": "generated-edge-simstep-a5f93691-63bb-4e26-8574-763af61af93b-253c3208-f450-42d2-9077-3f3ade4fcdaf",
|
|
"5ba138ab-65ed-4518-bad2-c6547536ee42": "generated-edge-simstep-22c1b95d-a9fc-4082-9122-451faaef6702-5ba138ab-65ed-4518-bad2-c6547536ee42",
|
|
"93bdc64f-4b39-440b-a6f2-ab491f9ef575": "generated-edge-simstep-dbbf3f0b-f780-4332-8e9c-40d49995db7e-93bdc64f-4b39-440b-a6f2-ab491f9ef575",
|
|
"31b1cc97-11e9-49ad-a4d3-212f95564fbc": "generated-edge-simstep-5f30ed11-8b51-4764-ad5d-3e7e5b41dea3-31b1cc97-11e9-49ad-a4d3-212f95564fbc",
|
|
"709ed4a5-434c-4f99-b716-0545f49e52c6": "docs_src/body_multiple_params",
|
|
"f2ee5d12-0dd3-4bdf-a7d9-f06233086074": "docs_src/body_multiple_params/tutorial003.py",
|
|
"3272394c-4b6b-4e76-872d-d6916dc99c37": "docs_src/body_multiple_params/tutorial003.py-simstep-c7f20cc8-9c3a-42a6-995f-39a4280ead6e",
|
|
"760ebe9f-b9e2-407a-ab19-aae6b8b0c27c": "fastapi/dependencies/utils.py-simstep-99ccde73-4228-43bc-ac85-bc419331ab5b",
|
|
"1528bb9f-0a02-44f7-8fb9-f12c89cff357": "fastapi/routing.py-simstep-de4c4a4a-b0ac-46a6-9944-b98922d68fef",
|
|
"5512bc30-2be8-49c0-9f1a-b4df70f28286": "fastapi/dependencies/utils.py-simstep-b4eaa910-fd79-4356-82a8-0c56e90ca2cf",
|
|
"53058048-3874-442b-a561-6a04804417d7": "docs_src/body_multiple_params/tutorial003.py-simstep-62acd131-b4d2-4f6d-9e2e-67f61f5b1b95",
|
|
"f7377c05-48b6-4245-b09b-30e0abea3484": "generated-edge-simstep-a2997e81-9fc8-4f9d-adf2-7fac56a58991-f7377c05-48b6-4245-b09b-30e0abea3484",
|
|
"c85c9776-5f78-48a8-af8b-764a29b604fc": "generated-edge-simstep-8a4b91fb-6482-4753-834a-2b9328f3941d-c85c9776-5f78-48a8-af8b-764a29b604fc",
|
|
"c178ca0c-2977-4fc1-bba5-9daf176b094e": "generated-edge-simstep-16cb1e94-5a42-47e2-8661-e932a4148bff-c178ca0c-2977-4fc1-bba5-9daf176b094e",
|
|
"678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4": "generated-edge-simstep-ea22f412-f25b-414f-b8de-5564d2f9a7c0-678ca9ea-fb76-45c5-8fe3-5e11ad41e7e4",
|
|
"2e0c66ab-b7e0-4b05-8614-eca7ab5cca17": "docs_src/async_tests",
|
|
"aa72b614-49af-48c1-a5c3-3bc1b45981e5": "docs_src/async_tests/main.py",
|
|
"6d538c95-7002-4e13-a58e-42276e93a916": "docs_src/async_tests/main.py-simstep-cda447ab-9d46-497c-a8cb-c2892e622443",
|
|
"723adc58-e008-43e8-a4a5-f27f1e5b9b72": "fastapi/applications.py-simstep-af17a645-e3b8-4db6-8ade-2962b52b1ddb",
|
|
"4d253d9a-189a-4b27-bb06-5862fbba7283": "fastapi/routing.py-simstep-cb5273ef-8960-4c8b-8195-7a6384823794",
|
|
"5be4df9c-50fb-41d0-a436-85a1be744dc5": "fastapi/routing.py-simstep-7aee408c-be01-4088-a719-d30b71bd7973",
|
|
"3b4760d0-0289-4c64-9a67-b0b7911cb094": "fastapi/routing.py-simstep-d6a1afe7-2b97-49ad-9e12-3aa5332905b9",
|
|
"b74d9193-26b0-4b98-a1dc-e55e17c8a0e4": "fastapi/routing.py-simstep-9e3b06fe-61d2-45aa-8d83-4b604ab90f36",
|
|
"d4810b21-a037-499b-bf29-64229b7fb89d": "generated-edge-simstep-71aea8b0-90a3-4fcb-a6b0-f4666a7b6b51-d4810b21-a037-499b-bf29-64229b7fb89d",
|
|
"3645da23-6b02-4826-989e-51ba79139b97": "generated-edge-simstep-f60b3966-22e3-435a-aace-d86055caea49-3645da23-6b02-4826-989e-51ba79139b97",
|
|
"badccb56-99c5-43c0-8a2b-d49fb9b2c1cd": "generated-edge-simstep-514470f7-50a0-47ac-a636-8956036a0617-badccb56-99c5-43c0-8a2b-d49fb9b2c1cd",
|
|
"7c922d0b-5375-43f1-9ee5-5129e67ae842": "generated-edge-simstep-6b00d867-9ecb-4c51-be8b-06432f1af04f-7c922d0b-5375-43f1-9ee5-5129e67ae842",
|
|
"3bd58e0f-f6e9-402f-9597-cee988b040b1": "generated-edge-simstep-77d096c5-8eaa-4a70-a333-da9e81952a6d-3bd58e0f-f6e9-402f-9597-cee988b040b1",
|
|
"0b6a8b81-ee88-4d9e-9fb1-7f081fe4268e": "docs",
|
|
"2de61716-262e-4677-b295-06e651ae2cdd": "tests",
|
|
"6dc9040b-9a18-4adc-9e48-8101ad662c99": "docs_src/app_testing",
|
|
"06f4c382-b166-4cc9-a342-b407504d35d8": "fastapi/testclient.py",
|
|
"eeba5834-dc44-4983-ac8f-809375127cc9": "docs/en",
|
|
"71140f40-8323-49de-9210-f33c358fa2ef": "tests/test_dependency_overrides.py",
|
|
"43fe865e-b2ad-4d4a-963c-35618fc3cdda": "docs_src/app_testing/tutorial001.py",
|
|
"c4536ff7-38c9-4678-8471-cc92f8c3d93f": "docs/en/docs",
|
|
"56e59fec-d559-4ecf-aa7b-24f48977311a": "docs/en/docs/advanced",
|
|
"824784b9-9c78-4ddc-98cc-70f65c33f4b0": "docs/en/docs/advanced/testing-dependencies.md",
|
|
"bf1edc05-08ee-4c1c-80cf-21b4f531e0fe": "docs_src/app_testing/tutorial001.py-simstep-775603fe-da91-489f-996b-84107c8f7862",
|
|
"1c4e4a6c-1cb3-4852-986c-ea94a4fff224": "docs_src/app_testing/tutorial001.py-simstep-31594c7d-7192-434e-aedb-53c1584bf215",
|
|
"57c79588-0531-4abc-b526-cf50845249a7": "docs_src/app_testing/tutorial001.py-simstep-6036575c-1bb4-44d0-b975-985fd3d17016",
|
|
"970abd06-2dc8-4102-8055-8933609aeb67": "docs_src/app_testing/tutorial001.py-simstep-84a2b60d-be4a-4bba-80bc-3069c0e96cb6",
|
|
"38c3f10f-2301-458f-8ea1-2c20041c520a": "docs_src/dependency_testing/tutorial001.py-simstep-c52deddc-1975-4055-873c-0f72bf2dc3cb",
|
|
"71af56b2-6d44-43a3-a912-2a66fa6e854c": "docs_src/dependency_testing/tutorial001.py-simstep-557f6440-8ca0-4cae-922e-4c5da5dc8da9",
|
|
"9e49809a-f9f0-44b7-af22-ccc5f43b02c7": "fastapi/dependencies/utils.py-simstep-62faa1e9-54f0-47a0-b0fb-edb3be742c09",
|
|
"0627101a-26d2-4e87-86b0-ab6e9c5e83ad": "docs_src/dependency_testing/tutorial001.py-simstep-3b306a98-022e-4b79-9315-8d86042184d0",
|
|
"5ff2344e-a0ef-4568-8efc-3e9007a015f9": "tests/test_dependency_overrides.py-simstep-e74a56d7-7c39-4391-8202-b685d0c85ea2",
|
|
"1d40db3a-214d-4571-a103-38478d8d830a": "generated-edge-simstep-a26868d0-9f91-4185-8655-04b861761020-1d40db3a-214d-4571-a103-38478d8d830a",
|
|
"0a7b0cb1-c602-4466-a1e8-6f2b076c75f5": "generated-edge-simstep-a9785563-55e1-46e5-8f87-ea5544bb32a0-0a7b0cb1-c602-4466-a1e8-6f2b076c75f5",
|
|
"a28abe3f-2890-4751-a4c2-042299a647a1": "generated-edge-simstep-94a37941-4c78-4ba5-9a30-98a78e824b1e-a28abe3f-2890-4751-a4c2-042299a647a1",
|
|
"cebf7614-db24-432b-869f-fd8c57568bf7": "generated-edge-simstep-749ef148-2b08-4234-9248-1ef9325528d3-cebf7614-db24-432b-869f-fd8c57568bf7",
|
|
"ea2a2c4d-e465-4003-8375-a3c644eea489": "generated-edge-simstep-13ed8244-da90-47be-a387-2648e230906f-ea2a2c4d-e465-4003-8375-a3c644eea489",
|
|
"b45dcb5e-18e8-46a3-95d0-7911502d6f89": "generated-edge-simstep-608b856c-54dd-438b-ab09-0d8162edbb10-b45dcb5e-18e8-46a3-95d0-7911502d6f89",
|
|
"3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7": "generated-edge-simstep-d3f981a3-7782-49a8-901b-5103f3c6317f-3b7d50ea-ffb0-47c3-a8fc-312ad6e015d7",
|
|
"19928fa5-ddd3-422d-8617-7f4b84e33ba7": "generated-edge-simstep-d351ce27-af6c-4deb-b663-45e7cdc3a807-19928fa5-ddd3-422d-8617-7f4b84e33ba7",
|
|
"b61db9f9-9cf6-428b-9da7-92da54855cd7": "docs_src/bigger_applications/app/routers/items.py",
|
|
"603b4eb9-d4e5-4d23-b806-e5d29565c715": "docs_src/bigger_applications/app/routers/users.py-simstep-d50816dd-f2a3-4fa9-8fb5-ef6a35151ca6",
|
|
"f9a14e30-e10d-4e53-a595-158cce2646a0": "docs_src/bigger_applications/app/routers/items.py-simstep-e0b88502-55e5-4b9c-a970-9b325ed8a8e2",
|
|
"906297f0-cfb7-4c0f-b6cf-47ee77938360": "docs_src/bigger_applications/app/main.py-simstep-99aeff6f-e85d-4990-8fbd-3ebab1aa05fe",
|
|
"4007f37b-ba49-4437-918a-380bc8859f5a": "docs_src/bigger_applications/app/main.py-simstep-cfcc3244-3cb4-40fc-9208-ebe7d0feac88",
|
|
"02519ecd-f449-46a3-8430-6cf6760a4263": "fastapi/routing.py-simstep-ddd8a50b-d021-4486-a599-9cee3495e6e8",
|
|
"da65836d-fde5-450b-a63f-8856ed4ef131": "docs_src/bigger_applications/app/main.py-simstep-7e887cf3-4cfc-48ab-b9c7-40c2883d8138",
|
|
"39f855f0-2d15-4865-90bf-cce2d20bb759": "generated-edge-simstep-d38d244e-dd81-47db-a290-4b9d16b30792-39f855f0-2d15-4865-90bf-cce2d20bb759",
|
|
"eff4590a-a5ea-4a00-b6ff-d997c92439f0": "generated-edge-simstep-798e0b67-70cc-409b-9f66-4f20967121b6-eff4590a-a5ea-4a00-b6ff-d997c92439f0",
|
|
"5e1e692a-53ef-4b61-9274-643796cecc8e": "generated-edge-simstep-9afe704a-5961-478e-92ca-d07b76735226-5e1e692a-53ef-4b61-9274-643796cecc8e",
|
|
"c3e08f7d-6ac8-4d7e-ab26-246ab6656e99": "generated-edge-simstep-1568332d-f98c-4c7f-a8d6-83920b8356f6-c3e08f7d-6ac8-4d7e-ab26-246ab6656e99",
|
|
"28e77bbc-acde-44e2-9e00-47f86912cb89": "generated-edge-simstep-8665befb-71e3-427e-b910-b262610cd999-28e77bbc-acde-44e2-9e00-47f86912cb89",
|
|
"7f9cc00d-55b1-43c7-926c-8cea814fb472": "docs_src/handling_errors",
|
|
"a5da997e-779f-443c-817f-711373a86660": "fastapi/exception_handlers.py",
|
|
"d35761a9-d525-4ba8-a82f-27021eff54c0": "docs_src/handling_errors/tutorial001.py",
|
|
"2c8af138-5b6d-4d3c-ab5f-5aebfb51515f": "docs_src/handling_errors/tutorial004.py",
|
|
"a01899f9-de7d-4a39-8f81-ae24c94c1008": "docs_src/handling_errors/tutorial006.py",
|
|
"cc96ff59-f849-4fc3-8c77-3c015a9af800": "docs_src/handling_errors/tutorial001.py-simstep-215fc83a-81b9-4126-98aa-43ceba5fd293",
|
|
"dc65b6d2-aebe-4270-a674-6ac2fb83c227": "fastapi/applications.py-simstep-b16094b3-792f-4a5b-aa82-614601c2e75c",
|
|
"326d1002-39bf-4422-8057-7ba0a4bdd024": "fastapi/exception_handlers.py-simstep-add0b602-fe90-4174-9cd5-e6b9f89a0144",
|
|
"aac8ce20-1982-4cfd-be7e-3b9cc5f7ab2a": "docs_src/handling_errors/tutorial004.py-simstep-67f98fe6-fc9a-4d2a-9d93-c141e1662671",
|
|
"a3ba77cb-c744-499b-96cc-aac2b755d957": "fastapi/routing.py-simstep-4d9c03e8-d9ae-4e75-ad27-a5030492d468",
|
|
"89c7b37c-31a9-4b7c-8152-a69518ca096e": "fastapi/exception_handlers.py-simstep-38f93061-0b96-4fab-9004-8523f30d77c2",
|
|
"ca47235c-5df6-4452-a574-2e6e3aa67b1b": "docs_src/handling_errors/tutorial004.py-simstep-fead7102-4576-468b-b4c4-d7f7d3d02160",
|
|
"2fac3163-54f8-456c-890c-17c6430e406d": "docs_src/handling_errors/tutorial004.py-simstep-c95e0d66-70bd-4d66-a616-cfe44a6b3131",
|
|
"4422434a-fd9d-4a7f-bae3-d67280e39a7e": "docs_src/handling_errors/tutorial004.py-simstep-f8ecd5a4-aee3-42bf-9e54-d44c44d550ee",
|
|
"4228354c-d857-427e-a55e-eae5cc0a0406": "generated-edge-simstep-3196e6b3-136a-4043-a63b-6cb5111f76c4-4228354c-d857-427e-a55e-eae5cc0a0406",
|
|
"fc2d073c-7206-4740-9d83-f258184c8226": "generated-edge-simstep-e64de2a8-6902-48ca-9640-98ac713f199a-fc2d073c-7206-4740-9d83-f258184c8226",
|
|
"458cb68b-a494-4b53-adf8-5d96d8d30f6f": "generated-edge-simstep-d42f179f-3990-4e75-a858-54d473837db3-458cb68b-a494-4b53-adf8-5d96d8d30f6f",
|
|
"e4285640-4dfa-4273-ac7a-81d5752548d0": "generated-edge-simstep-e60d5731-fd37-4e6b-a775-849fe7024e2c-e4285640-4dfa-4273-ac7a-81d5752548d0",
|
|
"41851979-7fc5-43e6-a100-0ee9357cb22a": "generated-edge-simstep-82b45422-fa0f-4098-8a60-ce7053307d29-41851979-7fc5-43e6-a100-0ee9357cb22a",
|
|
"23811991-d36d-4f07-8537-26065c5d3a44": "generated-edge-simstep-fe0f4226-4f2b-40e8-9444-b781c0208ccf-23811991-d36d-4f07-8537-26065c5d3a44",
|
|
"f264e35a-3ede-4cd4-a4f3-5468def4eef0": "generated-edge-simstep-1ae38365-5b41-4aa8-b6a4-51eac6888b15-f264e35a-3ede-4cd4-a4f3-5468def4eef0",
|
|
"f63e7186-ed41-432f-b2f3-4ede5013e529": "generated-edge-simstep-309cd2cd-9347-451f-880b-4ab7502a1b6b-f63e7186-ed41-432f-b2f3-4ede5013e529"
|
|
}
|
|
}
|
|
|