1 2<!doctype html> 3<html lang="en" class="no-js"> 4 <head> 5 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width,initial-scale=1"> 8 9 <meta name="description" content="The lightning-fast ASGI server."> 10 11 12 13 <link rel="canonical" href="https://uvicorn.dev/server-behavior/"> 14 15 16 <link rel="prev" href="../settings/"> 17 18 19 <link rel="next" href="../concepts/asgi/"> 20 21 22 23 24 25 <link rel="icon" href="../uvicorn.png"> 26 <meta name="generator" content="zensical-0.0.57"> 27 28 29 30 <title>Server Behavior - Uvicorn</title> 31 32 33 34 35 36 37 <link rel="stylesheet" href="../assets/stylesheets/modern/main.5da3a30f.min.css"> 38 39 40 41 42 <link rel="stylesheet" href="../assets/stylesheets/modern/palette.812a03bb.min.css"> 43 44 45 46 47 48 49 50 51 52 53 54 55 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 56 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback"> 57 <style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style> 58 59 60 61 <link rel="stylesheet" href="../css/extra.css"> 62 63
63<script>__md_scope=new URL("..",location),__md_scope.pathname.endsWith("/")||(__md_scope=new URL(__md_scope.pathname+"/",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+"."+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+"."+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute("data-platform",navigator.platform)</script>
63 64 65 66 67 68 69 70 71
72<script id="__analytics">function __md_analytics(){function e(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],e("js",new Date),e("config","G-KTS6TXPD85"),document.addEventListener("DOMContentLoaded",(function(){document.forms.search&&document.forms.search.query.addEventListener("blur",(function(){this.value&&e("event","search",{search_term:this.value})}));document$.subscribe((function(){var t=document.forms.feedback;if(void 0!==t)for(var a of t.querySelectorAll("[type=submit]"))a.addEventListener("click",(function(a){a.preventDefault();var n=document.location.pathname,d=this.getAttribute("data-md-value");e("event","feedback",{page:n,data:d}),t.firstElementChild.disabled=!0;var r=t.querySelector(".md-feedback__note [data-md-value='"+d+"']");r&&(r.hidden=!1)})),t.hidden=!1})),location$.subscribe((function(t){e("config","G-KTS6TXPD85",{page_path:t.pathname})}))}));var t=document.createElement("script");t.async=!0,t.src="https://www.googletagmanager.com/gtag/js?id=G-KTS6TXPD85",document.getElementById("__analytics").insertAdjacentElement("afterEnd",t)}</script>
72 73 74
74<script>"undefined"!=typeof __md_analytics&&__md_analytics()</script>
74 75 76 77 78 79 80
80<script> 81 // Redirect starlette.io to starlette.dev 82 if (window.location.hostname === 'www.uvicorn.org' || window.location.hostname === 'uvicorn.org') { 83 const newUrl = window.location.href.replace(/^https?:\/\/(www\.)?uvicorn\.org/, 'https://uvicorn.dev'); 84 window.location.replace(newUrl); 85 } 86 </script>
86 87 88 </head> 89 90 91 92 93 94 95 96 97 98 <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo"> 99 100 101 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> 102 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> 103 <label class="md-overlay" for="__drawer" aria-label="Navigation"></label> 104 <div data-md-component="skip"> 105 106 107 <a href="#server-behavior" class="md-skip"> 108 Skip to content 109 </a> 110 111 </div> 112 <div data-md-component="announce"> 113 114 </div> 115 116 117 118 119 120 121<header class="md-header md-header--shadow" data-md-component="header"> 122 <nav class="md-header__inner md-grid" aria-label="Header"> 123 <a href="./.." title="Uvicorn" class="md-header__button md-logo" aria-label="Uvicorn" data-md-component="logo"> 124 125 <img src="../uvicorn.png" alt="Uvicorn"> 126 127 </a> 128 <label class="md-header__button md-icon" for="__drawer" aria-label="Navigation"> 129 130 <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="lucide lucide-menu" viewBox="0 0 24 24"><path d="M4 5h16M4 12h16M4 19h16"/></svg> 131 </label> 132 <div class="md-header__title" data-md-component="header-title"> 133 <div class="md-header__ellipsis"> 134 <div class="md-header__topic"> 135 <span class="md-ellipsis"> 136 Uvicorn 137 </span> 138 </div> 139 <div class="md-header__topic" data-md-component="header-topic"> 140 <span class="md-ellipsis"> 141 142 Server Behavior 143 144 </span> 145 </div> 146 </div> 147 </div> 148 149 150 <form class="md-header__option" data-md-component="palette"> 151 152 153 154 155 <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0"> 156 157 <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden> 158 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7M9 21a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1H9z"/></svg> 159 </label> 160 161 162 163 164 165 <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="blue" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1"> 166 167 <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden> 168 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 1 7 7c0 2.38-1.19 4.47-3 5.74V17a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-2.26C6.19 13.47 5 11.38 5 9a7 7 0 0 1 7-7M9 21v-1h6v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1m3-17a5 5 0 0 0-5 5c0 2.05 1.23 3.81 3 4.58V16h4v-2.42c1.77-.77 3-2.53 3-4.58a5 5 0 0 0-5-5"/></svg> 169 </label> 170 171 172</form> 173 174 175 176
176<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
176 177 178 179 180 181 182 <label class="md-header__button md-icon" for="__search" aria-label="Search"> 183 184 <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="lucide lucide-search" viewBox="0 0 24 24"><path d="m21 21-4.34-4.34"/><circle cx="11" cy="11" r="8"/></svg> 185 </label> 186 <div class="md-search" data-md-component="search" role="dialog" aria-label="Search"> 187 <button type="button" class="md-search__button"> 188 Search 189 </button> 190</div> 191 192 193 <div class="md-header__source"> 194 195 <a href="https://github.com/Kludex/uvicorn" title="Go to repository" class="md-source" data-md-component="source"> 196 <div class="md-source__icon md-icon"> 197 198 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M216.5 362.5c-66-8-112.5-55.5-112.5-117 0-25 9-52 24-70-6.5-16.5-5.5-51.5 2-66 20-2.5 47 8 63 22.5 19-6 39-9 63.5-9s44.5 3 62.5 8.5c15.5-14 43-24.5 63-22 7 13.5 8 48.5 1.5 65.5 16 19 24.5 44.5 24.5 70.5 0 61.5-46.5 108-113.5 116.5 17 11 28.5 35 28.5 62.5v52c0 15 12.5 23.5 27.5 17.5C441 459.5 512 369 512 257 512 115.5 397 0 255.5 0S0 115.5 0 257c0 111 70.5 203 165.5 237.5 13.5 5 26.5-4 26.5-17.5v-40c-7 3-16 5-24 5-33 0-52.5-18-66.5-51.5-5.5-13.5-11.5-21.5-23-23-6-.5-8-3-8-6 0-6 10-10.5 20-10.5 14.5 0 27 9 40 27.5 10 14.5 20.5 21 33 21s20.5-4.5 32-16c8.5-8.5 15-16 21-21"/></svg> 199 </div> 200 <div class="md-source__repository"> 201 Kludex/uvicorn 202 </div> 203</a> 204 205 </div> 206 </nav> 207 208</header> 209 210 <div class="md-container" data-md-component="container"> 211 212 213 214 215 216 217 <main class="md-main" data-md-component="main"> 218 <div class="md-main__inner md-grid"> 219 220 221 222 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > 223 <div class="md-sidebar__scrollwrap"> 224 <div class="md-sidebar__inner"> 225 226 227 228 229<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0"> 230 <label class="md-nav__title" for="__drawer"> 231 <a href="./.." title="Uvicorn" class="md-nav__button md-logo" aria-label="Uvicorn" data-md-component="logo"> 232 233 <img src="../uvicorn.png" alt="Uvicorn"> 234 235 </a> 236 Uvicorn 237 </label> 238 239 <div class="md-nav__source"> 240 <a href="https://github.com/Kludex/uvicorn" title="Go to repository" class="md-source" data-md-component="source"> 241 <div class="md-source__icon md-icon"> 242 243 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M216.5 362.5c-66-8-112.5-55.5-112.5-117 0-25 9-52 24-70-6.5-16.5-5.5-51.5 2-66 20-2.5 47 8 63 22.5 19-6 39-9 63.5-9s44.5 3 62.5 8.5c15.5-14 43-24.5 63-22 7 13.5 8 48.5 1.5 65.5 16 19 24.5 44.5 24.5 70.5 0 61.5-46.5 108-113.5 116.5 17 11 28.5 35 28.5 62.5v52c0 15 12.5 23.5 27.5 17.5C441 459.5 512 369 512 257 512 115.5 397 0 255.5 0S0 115.5 0 257c0 111 70.5 203 165.5 237.5 13.5 5 26.5-4 26.5-17.5v-40c-7 3-16 5-24 5-33 0-52.5-18-66.5-51.5-5.5-13.5-11.5-21.5-23-23-6-.5-8-3-8-6 0-6 10-10.5 20-10.5 14.5 0 27 9 40 27.5 10 14.5 20.5 21 33 21s20.5-4.5 32-16c8.5-8.5 15-16 21-21"/></svg> 244 </div> 245 <div class="md-source__repository"> 246 Kludex/uvicorn 247 </div> 248</a> 249 </div> 250 251 <ul class="md-nav__list" data-md-scrollfix> 252 253 254 255 256 257 258 259 <li class="md-nav__item"> 260 <a href="./.." class="md-nav__link"> 261 262 263 264 <span class="md-ellipsis"> 265 266 267 Welcome 268 269 270 </span> 271 272 273 274 </a> 275 </li> 276 277 278 279 280 281 282 283 284 285 <li class="md-nav__item"> 286 <a href="../installation/" class="md-nav__link"> 287 288 289 290 <span class="md-ellipsis"> 291 292 293 Installation 294 295 296 </span> 297 298 299 300 </a> 301 </li> 302 303 304 305 306 307 308 309 310 311 <li class="md-nav__item"> 312 <a href="../settings/" class="md-nav__link"> 313 314 315 316 <span class="md-ellipsis"> 317 318 319 Settings 320 321 322 </span> 323 324 325 326 </a> 327 </li> 328 329 330 331 332 333 334 335 336 337 338 339 <li class="md-nav__item md-nav__item--active"> 340 341 342 343 344 345 346 347 <label class="md-nav__link md-nav__link--active" for="__toc"> 348 349 350 351 <span class="md-ellipsis"> 352 353 354 Server Behavior 355 356 357 </span> 358 359 360
361 <span class="md-nav__icon md-icon"></span> 362 </label> 363 364 <a href="././" class="md-nav__link md-nav__link--active"> 365 366 367 368 <span class="md-ellipsis"> 369 370 371 Server Behavior 372 373 374 </span> 375 376 377 378 </a> 379 380 381 382 383<nav class="md-nav md-nav--secondary" aria-label="On this page"> 384 385 386 387 388 389 390 <label class="md-nav__title" for="__toc"> 391 <span class="md-nav__icon md-icon"></span> 392 On this page 393 </label> 394 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> 395 396 <li class="md-nav__item"> 397 <a href="#http-headers" class="md-nav__link"> 398 <span class="md-ellipsis"> 399 <span class="md-typeset"> 400 HTTP Headers 401 </span> 402 </span> 403 </a> 404 405</li> 406 407 <li class="md-nav__item"> 408 <a href="#flow-control" class="md-nav__link"> 409 <span class="md-ellipsis"> 410 <span class="md-typeset"> 411 Flow Control 412 </span> 413 </span> 414 </a> 415 416 <nav class="md-nav" aria-label="Flow Control"> 417 <ul class="md-nav__list"> 418 419 <li class="md-nav__item"> 420 <a href="#write-flow-control" class="md-nav__link"> 421 <span class="md-ellipsis"> 422 <span class="md-typeset"> 423 Write flow control 424 </span> 425 </span> 426 </a> 427 428</li> 429 430 <li class="md-nav__item"> 431 <a href="#read-flow-control" class="md-nav__link"> 432 <span class="md-ellipsis"> 433 <span class="md-typeset"> 434 Read flow control 435 </span> 436 </span> 437 </a> 438 439</li> 440 441 </ul> 442 </nav> 443 444</li> 445 446 <li class="md-nav__item"> 447 <a href="#request-and-response-bodies" class="md-nav__link"> 448 <span class="md-ellipsis"> 449 <span class="md-typeset"> 450 Request and Response bodies 451 </span> 452 </span> 453 </a> 454 455 <nav class="md-nav" aria-label="Request and Response bodies"> 456 <ul class="md-nav__list"> 457 458 <li class="md-nav__item"> 459 <a href="#response-completion" class="md-nav__link"> 460 <span class="md-ellipsis"> 461 <span class="md-typeset"> 462 Response completion 463 </span> 464 </span> 465 </a> 466 467</li> 468 469 <li class="md-nav__item"> 470 <a href="#expect-100-continue" class="md-nav__link"> 471 <span class="md-ellipsis"> 472 <span class="md-typeset"> 473 Expect: 100-Continue 474 </span> 475 </span> 476 </a> 477 478</li> 479 480 <li class="md-nav__item"> 481 <a href="#head-requests" class="md-nav__link"> 482 <span class="md-ellipsis"> 483 <span class="md-typeset"> 484 HEAD requests 485 </span> 486 </span> 487 </a> 488 489</li> 490 491 </ul> 492 </nav> 493 494</li> 495 496 <li class="md-nav__item"> 497 <a href="#timeouts" class="md-nav__link"> 498 <span class="md-ellipsis"> 499 <span class="md-typeset"> 500 Timeouts 501 </span> 502 </span> 503 </a> 504 505</li> 506 507 <li class="md-nav__item"> 508 <a href="#resource-limits" class="md-nav__link"> 509 <span class="md-ellipsis"> 510 <span class="md-typeset"> 511 Resource Limits 512 </span> 513 </span> 514 </a> 515 516 <nav class="md-nav" aria-label="Resource Limits"> 517 <ul class="md-nav__list"> 518 519 <li class="md-nav__item"> 520 <a href="#concurrency-and-backlog" class="md-nav__link"> 521 <span class="md-ellipsis"> 522 <span class="md-typeset"> 523 Concurrency and backlog 524 </span> 525 </span> 526 </a> 527 528</li> 529 530 </ul> 531 </nav> 532 533</li> 534 535 <li class="md-nav__item"> 536 <a href="#server-errors" class="md-nav__link"> 537 <span class="md-ellipsis"> 538 <span class="md-typeset"> 539 Server Errors 540 </span> 541 </span> 542 </a> 543 544 <nav class="md-nav" aria-label="Server Errors"> 545 <ul class="md-nav__list"> 546 547 <li class="md-nav__item"> 548 <a href="#exceptions" class="md-nav__link"> 549 <span class="md-ellipsis"> 550 <span class="md-typeset"> 551 Exceptions 552 </span> 553 </span> 554 </a> 555 556</li> 557 558 <li class="md-nav__item"> 559 <a href="#invalid-responses" class="md-nav__link"> 560 <span class="md-ellipsis"> 561 <span class="md-typeset"> 562 Invalid responses 563 </span> 564 </span> 565 </a> 566 567</li> 568 569 </ul> 570 </nav> 571 572</li> 573 574 <li class="md-nav__item"> 575 <a href="#graceful-process-shutdown" class="md-nav__link"> 576 <span class="md-ellipsis">
577 <span class="md-typeset"> 578 Graceful Process Shutdown 579 </span> 580 </span> 581 </a> 582 583</li> 584 585 <li class="md-nav__item"> 586 <a href="#http-pipelining" class="md-nav__link"> 587 <span class="md-ellipsis"> 588 <span class="md-typeset"> 589 HTTP Pipelining 590 </span> 591 </span> 592 </a> 593 594</li> 595 596 </ul> 597 598</nav> 599 600 </li> 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 <li class="md-nav__item md-nav__item--section md-nav__item--nested"> 621 622 623 624 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > 625 626 627 <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex=""> 628 629 630 631 <span class="md-ellipsis"> 632 633 634 Concepts 635 636 637 </span> 638 639 640 641 <span class="md-nav__icon md-icon"></span> 642 </label> 643 644 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false"> 645 <label class="md-nav__title" for="__nav_5"> 646 <span class="md-nav__icon md-icon"></span> 647 648 649 Concepts 650 651 </label> 652 <ul class="md-nav__list" data-md-scrollfix> 653 654 655 656 657 658 659 660 <li class="md-nav__item"> 661 <a href="../concepts/asgi/" class="md-nav__link"> 662 663 664 665 <span class="md-ellipsis"> 666 667 668 ASGI 669 670 671 </span> 672 673 674 675 </a> 676 </li> 677 678 679 680 681 682 683 684 685 686 687 <li class="md-nav__item"> 688 <a href="../concepts/lifespan/" class="md-nav__link"> 689 690 691 692 <span class="md-ellipsis"> 693 694 695 Lifespan 696 697 698 </span> 699 700 701 702 </a> 703 </li> 704 705 706 707 708 709 710 711 712 713 714 <li class="md-nav__item"> 715 <a href="../concepts/http2/" class="md-nav__link"> 716 717 718 719 <span class="md-ellipsis"> 720 721 722 HTTP/2 723 724 725 </span> 726 727 728 729 </a> 730 </li> 731 732 733 734 735 736 737 738 739 740 741 <li class="md-nav__item"> 742 <a href="../concepts/logging/" class="md-nav__link"> 743 744 745 746 <span class="md-ellipsis"> 747 748 749 Logging 750 751 752 </span> 753 754 755 756 </a> 757 </li> 758 759 760 761 762 763 764 765 766 767 768 <li class="md-nav__item"> 769 <a href="../concepts/http-protocols/" class="md-nav__link"> 770 771 772 773 <span class="md-ellipsis"> 774 775 776 HTTP Protocols 777 778 779 </span> 780 781 782 783 </a> 784 </li> 785 786 787 788 789 790 791 792 793 794 795 <li class="md-nav__item"> 796 <a href="../concepts/websockets/" class="md-nav__link"> 797 798 799 800 <span class="md-ellipsis"> 801 802 803 WebSockets 804 805 806 </span> 807 808 809 810 </a> 811 </li> 812 813 814 815 816 817 818 819 820 821 822 <li class="md-nav__item"> 823 <a href="../concepts/event-loop/" class="md-nav__link"> 824 825 826 827 <span class="md-ellipsis"> 828 829 830 Event Loop 831 832 833 </span> 834 835 836 837 </a> 838 </li> 839 840 841 842 843 </ul> 844 </nav> 845 846 </li> 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 <li class="md-nav__item md-nav__item--section md-nav__item--nested"> 867 868 869 870 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > 871 872 873 <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex=""> 874 875 876 877 <span class="md-ellipsis"> 878 879 880 Deployment 881 882 883 </span> 884 885 886 887 <span class="md-nav__icon md-icon"></span> 888 </label> 889 890 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> 891 <label class="md-nav__title" for="__nav_6"> 892 <span class="md-nav__icon md-icon"></span> 893 894 895 Deployment 896 897 </label> 898 <ul class="md-nav__list" data-md-scrollfix> 899 900 901 902 903 904 905 906 <li class="md-nav__item"> 907 <a href="../deployment/" class="md-nav__link"> 908 909 910 911 <span class="md-ellipsis"> 912 913 914 Deployment 915 916 917 </span> 918 919 920 921 </a> 922 </li> 923 924 925 926 927 928 929 930 931 932 933 <li class="md-nav__item"> 934 <a href="../deployment/docker/" class="md-nav__link"> 935 936 937 938 <span class="md-ellipsis"> 939 940 941 Docker 942 943 944 </span> 945 946 947 948 </a> 949 </li> 950 951 952 953 954 </ul> 955 </nav> 956 957 </li> 958 959 960 961 962 963 964 965 966 967 <li class="md-nav__item"> 968 <a href="../release-notes/" class="md-nav__link"> 969 970 971 972 <span class="md-ellipsis"> 973 974 975 Release Notes 976 977 978 </span> 979 980 981 982 </a> 983 </li> 984 985 986 987 988 989 990 991 992 993 <li class="md-nav__item"> 994 <a href="../contributing/" class="md-nav__link"> 995 996 997 998 <span class="md-ellipsis"> 999 1000 1001 Contributing 1002 1003 1004 </span> 1005 1006 1007 1008 </a> 1009 </li> 1010 1011 1012 1013 </ul> 1014 <div class="md-nav__sponsors"> 1015 <p class="md-nav__sponsors-title">Sponsors</p> 1016 <a href="https://fastapi.tiangolo.com" title="FastAPI" class="md-nav__sponsor"> 1017 <img src="../img/fastapi-logo.png" alt="FastAPI"> 1018 </a> 1019 <a href="https://github.com/sponsors/Kludex" class="md-nav__sponsor-cta"> 1020 Become a sponsor! â¤ï¸ 1021 </a> 1022 </div> 1023</nav> 1024 </div> 1025 </div> 1026 </div> 1027 1028 1029 1030 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > 1031 <div class="md-sidebar__scrollwrap"> 1032 1033 1034 1035 1036 1037 1038 1039 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> 1040 <div class="md-sidebar-button__wrapper"> 1041 <label class="md-sidebar-button" for="__toc"></label> 1042 </div> 1043 1044 1045 <div class="md-sidebar__inner"> 1046 1047 1048 1049<nav class="md-nav md-nav--secondary" aria-label="On this page"> 1050 1051 1052 1053 1054 1055 1056 <label class="md-nav__title" for="__toc">
1057 <span class="md-nav__icon md-icon"></span> 1058 On this page 1059 </label> 1060 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> 1061 1062 <li class="md-nav__item"> 1063 <a href="#http-headers" class="md-nav__link"> 1064 <span class="md-ellipsis"> 1065 <span class="md-typeset"> 1066 HTTP Headers 1067 </span> 1068 </span> 1069 </a> 1070 1071</li> 1072 1073 <li class="md-nav__item"> 1074 <a href="#flow-control" class="md-nav__link"> 1075 <span class="md-ellipsis"> 1076 <span class="md-typeset"> 1077 Flow Control 1078 </span> 1079 </span> 1080 </a> 1081 1082 <nav class="md-nav" aria-label="Flow Control"> 1083 <ul class="md-nav__list"> 1084 1085 <li class="md-nav__item"> 1086 <a href="#write-flow-control" class="md-nav__link"> 1087 <span class="md-ellipsis"> 1088 <span class="md-typeset"> 1089 Write flow control 1090 </span> 1091 </span> 1092 </a> 1093 1094</li> 1095 1096 <li class="md-nav__item"> 1097 <a href="#read-flow-control" class="md-nav__link"> 1098 <span class="md-ellipsis"> 1099 <span class="md-typeset"> 1100 Read flow control 1101 </span> 1102 </span> 1103 </a> 1104 1105</li> 1106 1107 </ul> 1108 </nav> 1109 1110</li> 1111 1112 <li class="md-nav__item"> 1113 <a href="#request-and-response-bodies" class="md-nav__link"> 1114 <span class="md-ellipsis"> 1115 <span class="md-typeset"> 1116 Request and Response bodies 1117 </span> 1118 </span> 1119 </a> 1120 1121 <nav class="md-nav" aria-label="Request and Response bodies"> 1122 <ul class="md-nav__list"> 1123 1124 <li class="md-nav__item"> 1125 <a href="#response-completion" class="md-nav__link"> 1126 <span class="md-ellipsis"> 1127 <span class="md-typeset"> 1128 Response completion 1129 </span> 1130 </span> 1131 </a> 1132 1133</li> 1134 1135 <li class="md-nav__item"> 1136 <a href="#expect-100-continue" class="md-nav__link"> 1137 <span class="md-ellipsis"> 1138 <span class="md-typeset"> 1139 Expect: 100-Continue 1140 </span> 1141 </span> 1142 </a> 1143 1144</li> 1145 1146 <li class="md-nav__item"> 1147 <a href="#head-requests" class="md-nav__link"> 1148 <span class="md-ellipsis"> 1149 <span class="md-typeset"> 1150 HEAD requests 1151 </span> 1152 </span> 1153 </a> 1154 1155</li> 1156 1157 </ul> 1158 </nav> 1159 1160</li> 1161 1162 <li class="md-nav__item"> 1163 <a href="#timeouts" class="md-nav__link"> 1164 <span class="md-ellipsis"> 1165 <span class="md-typeset"> 1166 Timeouts 1167 </span> 1168 </span> 1169 </a> 1170 1171</li> 1172 1173 <li class="md-nav__item"> 1174 <a href="#resource-limits" class="md-nav__link"> 1175 <span class="md-ellipsis"> 1176 <span class="md-typeset"> 1177 Resource Limits 1178 </span> 1179 </span> 1180 </a> 1181 1182 <nav class="md-nav" aria-label="Resource Limits"> 1183 <ul class="md-nav__list"> 1184 1185 <li class="md-nav__item"> 1186 <a href="#concurrency-and-backlog" class="md-nav__link"> 1187 <span class="md-ellipsis"> 1188 <span class="md-typeset"> 1189 Concurrency and backlog 1190 </span> 1191 </span> 1192 </a> 1193 1194</li> 1195 1196 </ul> 1197 </nav> 1198 1199</li> 1200 1201 <li class="md-nav__item"> 1202 <a href="#server-errors" class="md-nav__link"> 1203 <span class="md-ellipsis"> 1204 <span class="md-typeset"> 1205 Server Errors 1206 </span> 1207 </span> 1208 </a> 1209 1210 <nav class="md-nav" aria-label="Server Errors"> 1211 <ul class="md-nav__list"> 1212 1213 <li class="md-nav__item"> 1214 <a href="#exceptions" class="md-nav__link"> 1215 <span class="md-ellipsis"> 1216 <span class="md-typeset"> 1217 Exceptions 1218 </span> 1219 </span> 1220 </a> 1221 1222</li> 1223 1224 <li class="md-nav__item"> 1225 <a href="#invalid-responses" class="md-nav__link"> 1226 <span class="md-ellipsis"> 1227 <span class="md-typeset"> 1228 Invalid responses 1229 </span> 1230 </span> 1231 </a> 1232 1233</li> 1234 1235 </ul> 1236 </nav> 1237 1238</li> 1239 1240 <li class="md-nav__item"> 1241 <a href="#graceful-process-shutdown" class="md-nav__link"> 1242 <span class="md-ellipsis"> 1243 <span class="md-typeset"> 1244 Graceful Process Shutdown 1245 </span> 1246 </span> 1247 </a> 1248 1249</li> 1250 1251 <li class="md-nav__item"> 1252 <a href="#http-pipelining" class="md-nav__link"> 1253 <span class="md-ellipsis">
1254 <span class="md-typeset"> 1255 HTTP Pipelining 1256 </span> 1257 </span> 1258 </a> 1259 1260</li> 1261 1262 </ul> 1263 1264</nav> 1265 </div> 1266 </div> 1267 </div> 1268 1269 1270 1271 <div class="md-content" data-md-component="content"> 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 <article class="md-content__inner md-typeset"> 1282 1283 1284 1285 1286 1287 1288<h1 id="server-behavior">Server Behavior<a class="headerlink" href="#server-behavior" title="Permanent link">¶</a></h1> 1289<p>Uvicorn is designed with particular attention to connection and resource management, in order to provide a robust server implementation. It aims to ensure graceful behavior to either server or client errors, and resilience to poor client behavior or denial of service attacks.</p> 1290<h2 id="http-headers">HTTP Headers<a class="headerlink" href="#http-headers" title="Permanent link">¶</a></h2> 1291<p>The <code>Server</code> and <code>Date</code> headers are added to all outgoing requests.</p> 1292<p>If a <code>Connection: Close</code> header is included then Uvicorn will close the connection after the response. Otherwise connections will stay open, pending the keep-alive timeout.</p> 1293<p>If a <code>Content-Length</code> header is included then Uvicorn will ensure that the content length of the response body matches the value in the header, and raise an error otherwise.</p> 1294<p>If no <code>Content-Length</code> header is included then Uvicorn will use chunked encoding for the response body, and will set a <code>Transfer-Encoding</code> header if required.</p> 1295<p>If a <code>Transfer-Encoding</code> header is included then any <code>Content-Length</code> header will be ignored.</p> 1296<p>HTTP headers are mandated to be case-insensitive. Uvicorn will always send response headers strictly in lowercase.</p> 1297<hr /> 1298<h2 id="flow-control">Flow Control<a class="headerlink" href="#flow-control" title="Permanent link">¶</a></h2> 1299<p>Proper flow control ensures that large amounts of data do not become buffered on the transport when either side of a connection is sending data faster than its counterpart is able to handle.</p> 1300<h3 id="write-flow-control">Write flow control<a class="headerlink" href="#write-flow-control" title="Permanent link">¶</a></h3> 1301<p>If the write buffer passes a high water mark, then Uvicorn ensures the ASGI <code>send</code> messages will only return once the write buffer has been drained below the low water mark.</p> 1302<h3 id="read-flow-control">Read flow control<a class="headerlink" href="#read-flow-control" title="Permanent link">¶</a></h3> 1303<p>Uvicorn will pause reading from a transport once the buffered request body hits a high water mark, and will only resume once <code>receive</code> has been called, or once the response has been sent.</p> 1304<hr /> 1305<h2 id="request-and-response-bodies">Request and Response bodies<a class="headerlink" href="#request-and-response-bodies" title="Permanent link">¶</a></h2> 1306<h3 id="response-completion">Response completion<a class="headerlink" href="#response-completion" title="Permanent link">¶</a></h3> 1307<p>Once a response has been sent, Uvicorn will no longer buffer any remaining request body. Any later calls to <code>receive</code> will return an <code>http.disconnect</code> message.</p> 1308<p>Together with the read flow control, this behavior ensures that responses that return without reading the request body will not stream any substantial amounts of data into memory.</p> 1309<h3 id="expect-100-continue">Expect: 100-Continue<a class="headerlink" href="#expect-100-continue" title="Permanent link">¶</a></h3> 1310<p>The <code>Expect: 100-Continue</code> header may be sent by clients to require a confirmation from the server before uploading the request body. This can be used to ensure that large request bodies are only sent once the client has confirmation that the server is willing to accept the request.</p> 1311<p>Uvicorn ensures that any required <code>100 Continue</code> confirmations are only sent if the ASGI application calls <code>receive</code> to read the request body.</p> 1312<p>Note that proxy configurations may not necessarily forward on <code>Expect: 100-Continue</code> headers. In particular, Nginx defaults to buffering request bodies, and automatically sends <code>100 Continues</code> rather than passing the header on to the upstream server.</p> 1313<h3 id="head-requests">HEAD requests<a class="headerlink" href="#head-requests" title="Permanent link">¶</a></h3> 1314<p>Uvicorn will strip any response body from HTTP requests with the <code>HEAD</code> method.</p> 1315<p>Applications should generally treat <code>HEAD</code> requests in the same manner as <code>GET</code> requests, in order to ensure that identical headers are sent in both cases, and that any ASGI middleware that modifies the headers will operate identically in either case.</p> 1316<p>One exception to this might be if your application serves large file downloads, in
1316which case you might wish to only generate the response headers.</p> 1317<hr /> 1318<h2 id="timeouts">Timeouts<a class="headerlink" href="#timeouts" title="Permanent link">¶</a></h2> 1319<p>Uvicorn provides the following timeouts:</p> 1320<ul> 1321<li>Keep-Alive. Defaults to 5 seconds. Between requests, connections must receive new data within this period or be disconnected.</li> 1322</ul> 1323<hr /> 1324<h2 id="resource-limits">Resource Limits<a class="headerlink" href="#resource-limits" title="Permanent link">¶</a></h2> 1325<p>Uvicorn provides the following resource limiting:</p> 1326<ul> 1327<li>Concurrency (<code>--limit-concurrency</code>). Defaults to <code>None</code>. If set, this provides a maximum number of concurrent tasks <em>or</em> open connections that should be allowed. Any new requests that arrive once this limit has been reached will result in a "503 Service Unavailable" response. Setting this value to a limit that you know your servers are able to support will help ensure reliable resource usage, even against significantly over-resourced servers.</li> 1328<li>Backlog (<code>--backlog</code>). Defaults to <code>2048</code>. The maximum number of connections the operating system will hold in the socket's accept queue before the worker accepts them. This is passed straight to the listening socket's <code>listen()</code> call.</li> 1329<li>Max requests (<code>--limit-max-requests</code>). Defaults to <code>None</code>. If set, this provides a maximum number of HTTP requests that will be serviced before terminating a process. Together with a process manager this can be used to prevent memory leaks from impacting long running processes.</li> 1330</ul> 1331<h3 id="concurrency-and-backlog">Concurrency and backlog<a class="headerlink" href="#concurrency-and-backlog" title="Permanent link">¶</a></h3> 1332<p><code>--limit-concurrency</code> and <code>--backlog</code> operate at different layers and do not interact. It is a common misconception that requests refused by <code>--limit-concurrency</code> are held in the <code>--backlog</code>; they are not.</p> 1333<p><strong><code>--limit-concurrency</code> is an application-level gate.</strong> When a request's headers have been fully received, Uvicorn checks whether the number of open connections <em>or</em> the number of in-flight request/response tasks has reached the limit. If so, it responds immediately with a "503 Service Unavailable" - the request is <strong>not</strong> queued and does <strong>not</strong> wait for a slot to free up. Both counts include the connection serving the current request, so a value of <code>N</code> admits at most <code>N - 1</code> <em>other</em> concurrent requests; in particular a value of <code>1</code> refuses every request. Note that the open-connection count includes idle keep-alive connections, so those also consume the budget: once the number of open connections reaches the limit, further requests are refused even if few requests are actively being processed. Because the check only runs after a connection has been accepted, <code>--limit-concurrency</code> does not stop connections from being accepted in the first place - that is governed by <code>--backlog</code>.</p> 1334<p><strong><code>--backlog</code> is an OS-level socket setting.</strong> It bounds the kernel's accept queue: connections that have completed the TCP handshake but that the worker has not yet <code>accept()</code>ed. Uvicorn accepts new connections eagerly, so under normal operation this queue stays near-empty and the setting has little observable effect. It only comes into play when connections arrive faster than the worker can accept them (for example during a large burst, or while the event loop is blocked). Once the queue is full the kernel stops accepting new connection attempts, and clients see a connection failure or timeout rather than a 503 (TCP will typically retry). Note that <code>--backlog</code> does not limit the number of connections a worker will ultimately serve - it only limits how many may sit <em>unaccepted</em> at once.</p> 1335<p>To make the distinction concrete, consider <code>--limit-concurrency 5</code> with a slow application and a burst of simultaneous requests: once the limit is reached, the excess requests receive a 503 essentially immediately - they are not held in the backlog and processed later. To instead <em>queue</em> excess load, put a reverse proxy (e.g. nginx) in front of Uvicorn, or scale out with more workers.</p> 1336<hr /> 1337<h2 id="server-errors">Server Errors<a class="headerlink" href="#server-errors" title="Permanent link">¶</a></h2> 1338<p>Server errors will be logged at the <code>error</code> log level. All logging defaults to being written to <code>stdout</code>.</p> 1339<h3 id="exceptions">Exceptions<a class="headerlink" href="#exceptions" title="Permanent link">¶</a></h3> 1340<p>If an exception is raised by an ASGI application, and a response has not yet been sent on the connection, then a <code>500 Server Error</code> HTTP response will be sent.</p> 1341<p>Uvicorn sends the headers and the status code as soon as it receives from the ASGI application. This means that if the application sends a <a href="https://asgi.readthedocs.io/en/latest/specs/www.html#response-start-sen
1341d-event">Response Start</a> 1342message with a status code of <code>200 OK</code>, and then an exception is raised, the response will still be sent with a status code of <code>200 OK</code>.</p> 1343<h3 id="invalid-responses">Invalid responses<a class="headerlink" href="#invalid-responses" title="Permanent link">¶</a></h3> 1344<p>Uvicorn will ensure that ASGI applications send the correct sequence of messages, and will raise errors otherwise. This includes checking for no response sent, partial response sent, or invalid message sequences being sent.</p> 1345<hr /> 1346<h2 id="graceful-process-shutdown">Graceful Process Shutdown<a class="headerlink" href="#graceful-process-shutdown" title="Permanent link">¶</a></h2> 1347<p>Graceful process shutdowns are particularly important during a restart period. During this period you want to:</p> 1348<ul> 1349<li>Start a number of new server processes to handle incoming requests, listening on the existing socket.</li> 1350<li>Stop the previous server processes from listening on the existing socket.</li> 1351<li>Close any connections that are not currently waiting on an HTTP response, and wait for any other connections to finalize their HTTP responses.</li> 1352<li>Wait for any background tasks to run to completion, such as occurs when the ASGI application has sent the HTTP response, but the asyncio task has not yet run to completion.</li> 1353</ul> 1354<p>Uvicorn handles process shutdown gracefully, ensuring that connections are properly finalized, and all tasks have run to completion. During a shutdown period Uvicorn will ensure that responses and tasks must still complete within the configured timeout periods.</p> 1355<hr /> 1356<h2 id="http-pipelining">HTTP Pipelining<a class="headerlink" href="#http-pipelining" title="Permanent link">¶</a></h2> 1357<p>HTTP/1.1 provides support for sending multiple requests on a single connection, before having received each corresponding response. Servers are required to support HTTP pipelining, but it is now generally accepted to lead to implementation issues. It is not enabled on browsers, and may not necessarily be enabled on any proxies that the HTTP request passes through.</p> 1358<p>Uvicorn supports pipelining pragmatically. It will queue up any pipelined HTTP requests, and pause reading from the underlying transport. It will not start processing pipelined requests until each response has been dealt with in turn.</p> 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 </article> 1377 </div> 1378 1379 1380
1380<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
1380 1381
1382<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1382 1383 </div> 1384 1385 <button type="button" class="md-top md-icon" data-md-component="top" hidden> 1386 1387 <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="lucide lucide-circle-arrow-up" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="m16 12-4-4-4 4M12 16V8"/></svg> 1388 Back to top 1389</button> 1390 1391 </main> 1392 1393 <footer class="md-footer"> 1394 1395 1396 1397 <nav class="md-footer__inner md-grid" aria-label="Footer" > 1398 1399 1400 <a href="../settings/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Settings"> 1401 <div class="md-footer__button md-icon"> 1402 1403 <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="lucide lucide-arrow-left" viewBox="0 0 24 24"><path d="m12 19-7-7 7-7M19 12H5"/></svg> 1404 </div> 1405 <div class="md-footer__title"> 1406 <span class="md-footer__direction"> 1407 Previous 1408 </span> 1409 <div class="md-ellipsis"> 1410 Settings 1411 </div> 1412 </div> 1413 </a> 1414 1415 1416 1417 <a href="../concepts/asgi/" class="md-footer__link md-footer__link--next" aria-label="Next: ASGI"> 1418 <div class="md-footer__title"> 1419 <span class="md-footer__direction"> 1420 Next 1421 </span> 1422 <div class="md-ellipsis"> 1423 ASGI 1424 </div> 1425 </div> 1426 <div class="md-footer__button md-icon"> 1427 1428 <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" class="lucide lucide-arrow-right" viewBox="0 0 24 24"><path d="M5 12h14M12 5l7 7-7 7"/></svg> 1429 </div> 1430 </a> 1431 1432 </nav> 1433 1434 1435 <div class="md-footer-meta md-typeset"> 1436 <div class="md-footer-meta__inner md-grid"> 1437 <div class="md-copyright"> 1438 1439 1440 Made with 1441 <a href="https://zensical.org/" target="_blank" rel="noopener"> 1442 Zensical 1443 </a> 1444 1445</div> 1446 1447 1448<div class="md-social"> 1449 1450 1451 1452 1453 1454 1455 1456 1457 <a href="https://github.com/Kludex/uvicorn" target="_blank" rel="noopener" title="github.com" class="md-social__link"> 1458 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M202.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1M496 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2m-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3m-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1"/></svg> 1459 </a> 1460 1461 1462 1463 1464 1465 1466 1467 1468 <a href="https://discord.com/invite/RxKUF5JuHs" target="_blank" rel="noopener" title="discord.com" class="md-social__link"> 1469 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M492.5 69.8c-.2-.3-.4-.6-.8-.7-38.1-17.5-78.4-30-119.7-37.1-.4-.1-.8 0-1.1.1s-.6.4-.8.8c-5.5 9.9-10.5 20.2-14.9 30.6-44.6-6.8-89.9-6.8-134.4 0-4.5-10.5-9.5-20.7-15.1-30.6-.2-.3-.5-.6-.8-.8s-.7-.2-1.1-.2C162.5 39 122.2 51.5 84.1 69c-.3.1-.6.4-.8.7C7.1 183.5-13.8 294.6-3.6 404.2c0 .3.1.5.2.8s.3.4.5.6c44.4 32.9 94 58 146.8 74.2.4.1.8.1 1.1 0s.7-.4.9-.7c11.3-15.4 21.4-31.8 30-48.8.1-.2.2-.5.2-.8s0-.5-.1-.8-.2-.5-.4-.6-.4-.3-.7-.4c-15.8-6.1-31.2-13.4-45.9-21.9-.3-.2-.5-.4-.7-.6s-.3-.6-.3-.9 0-.6.2-.9.3-.5.6-.7c3.1-2.3 6.2-4.7 9.1-7.1.3-.2.6-.4.9-.4s.7 0 1 .1c96.2 43.9 200.4 43.9 295.5 0 .3-.1.7-.2 1-.2s.7.2.9.4c2.9 2.4 6 4.9 9.1 7.2.2.2.4.4.6.7s.2.6.2.9-.1.6-.3.9-.4.5-.6.6c-14.7 8.6-30 15.9-45.9 21.8-.2.1-.5.2-.7.4s-.3.4-.4.7-.1.5-.1.8.1.5.2.8c8.8 17 18.8 33.3 30 48.8.2.3.6.6.9.7s.8.1 1.1 0c52.9-16.2 102.6-41.3 147.1-74.2.2-.2.4-.4.5-.6s.2-.5.2-.8c12.3-126.8-20.5-236.9-86.9-334.5zm-302 267.7c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.4 59.2-52.8 59.2m195.4 0c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.2 59.2-52.8 59.2"/></svg> 1470 </a> 1471 1472 1473 1474 1475 1476 1477 1478 1479 <a href="https://x.com/marcelotryle" target="_blank" rel="noopener" title="x.com" class="md-social__link"> 1480 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.-->
1480<path fill="currentColor" d="M459.4 151.7c.3 4.5.3 9.1.3 13.6 0 138.7-105.6 298.6-298.6 298.6-59.5 0-114.7-17.2-161.1-47.1 8.4 1 16.6 1.3 25.3 1.3 49.1 0 94.2-16.6 130.3-44.8-46.1-1-84.8-31.2-98.1-72.8 6.5 1 13 1.6 19.8 1.6 9.4 0 18.8-1.3 27.6-3.6-48.1-9.7-84.1-52-84.1-103v-1.3c14 7.8 30.2 12.7 47.4 13.3-28.3-18.8-46.8-51-46.8-87.4 0-19.5 5.2-37.4 14.3-53C87.4 130.8 165 172.4 252.1 176.9c-1.6-7.8-2.6-15.9-2.6-24C249.5 95.1 296.3 48 354.4 48c30.2 0 57.5 12.7 76.7 33.1 23.7-4.5 46.5-13.3 66.6-25.3-7.8 24.4-24.4 44.8-46.1 57.8 21.1-2.3 41.6-8.1 60.4-16.2-14.3 20.8-32.2 39.3-52.6 54.3"/></svg> 1481 </a> 1482 1483 1484 1485 1486 1487 1488 1489 1490 <a href="https://www.linkedin.com/in/marcelotryle" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> 1491 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zM102.2 96a38.5 38.5 0 1 1 0 77 38.5 38.5 0 1 1 0-77m282.1 320h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> 1492 </a> 1493 1494 1495 1496 1497 1498 1499 1500 1501 <a href="https://fastapiexpert.com" target="_blank" rel="noopener" title="fastapiexpert.com" class="md-social__link"> 1502 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.3.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M351.9 280H161c2.9 64.5 17.2 123.9 37.5 167.4 11.4 24.5 23.7 41.8 35.1 52.4 11.2 10.5 18.9 12.2 22.9 12.2s11.7-1.7 22.9-12.2c11.4-10.6 23.7-28 35.1-52.4 20.3-43.5 34.6-102.9 37.5-167.4zm-191-48h190.9c-2.8-64.5-17.1-123.9-37.4-167.4-11.4-24.4-23.7-41.8-35.1-52.4C268.1 1.7 260.4 0 256.4 0s-11.7 1.7-22.9 12.2c-11.4 10.6-23.7 28-35.1 52.4-20.3 43.5-34.6 102.9-37.5 167.4m-48 0c3.5-85.6 25.6-165.1 57.9-217.3C78.7 47.3 10.9 131.2 1.5 232zM1.5 280c9.4 100.8 77.2 184.7 169.3 217.3-32.3-52.2-54.4-131.7-57.9-217.3zm398.4 0c-3.5 85.6-25.6 165.1-57.9 217.3 92.1-32.7 159.9-116.5 169.3-217.3zm111.4-48C501.9 131.2 434.1 47.3 342 14.7c32.3 52.2 54.4 131.7 57.9 217.3z"/></svg> 1503 </a> 1504 1505</div> 1506 1507 </div> 1508 </div> 1509</footer> 1510 1511 </div> 1512 <div class="md-dialog" data-md-component="dialog"> 1513 <div class="md-dialog__inner md-typeset"></div> 1514 </div> 1515 1516 1517 1518 1519 1520
1520<script id="__config" type="application/json">{"annotate":null,"base":"..","features":["content.code.annotate","content.code.copy","content.tabs.link","navigation.footer","navigation.path","navigation.sections","navigation.top","navigation.tracking","search.suggest","search.highlight","toc.follow"],"search":"../assets/javascripts/workers/search.7d14d953.min.js","tags":null,"translations":{"clipboard.copied":"Copied to clipboard","clipboard.copy":"Copy to clipboard","search.result.more.one":"1 more on this page","search.result.more.other":"# more on this page","search.result.none":"No matching documents","search.result.one":"1 matching document","search.result.other":"# matching documents","search.result.placeholder":"Type to start searching","search.result.term.missing":"Missing","select.version":"Select version"},"version":null}</script>
1520 1521 1522 1523
1523<script src="../assets/javascripts/bundle.49251538.min.js"></script>
1523 1524 1525 1526
1526<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"03a54d458289400ab1777c12e974d412","r":1,"spa":2}' crossorigin="anonymous"></script>
1526 1527</body> 1528</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.