- Cooperative signal handling (#1600) 19/03/24
- Revert raise
ClientDisconnected
on HTTP (#2276) 19/03/24
- Raise
ClientDisconnected
onsend()
when client disconnected (#2220) 12/02/24
- Except
AttributeError
onsys.stdin.fileno()
for Windows IIS10 (#1947) 29/02/24 - Use
X-Forwarded-Proto
for WebSockets scheme when the proxy provides it (#2258) 01/03/24
- Fix spurious LocalProtocolError errors when processing pipelined requests (#2243) 10/02/24
- Fix nav overrides for newer version of Mkdocs Material (#2233) 26/01/24
- Raise
ClientDisconnect(IOError)
onsend()
when client disconnected (#2218) 19/01/24 - Bump ASGI WebSocket spec version to 2.4 (#2221) 20/01/24
- Update
--root-path
to include the root path prefix in the full ASGIpath
as per the ASGI spec (#2213) 16/01/24 - Use
__future__.annotations
on some internal modules (#2199) 16/01/24
- Support the WebSocket Denial Response ASGI extension (#1916) 17/12/23
- Allow explicit hidden file paths on
--reload-include
(#2176) 08/12/23 - Properly annotate
uvicorn.run()
(#2158) 22/11/23
- Revert mkdocs-material from 9.1.21 to 9.2.6 (#2148) 05/11/23
- Support Python 3.12 (#2145) 04/11/23
- Allow setting
app
via environment variableUVICORN_APP
(#2106) 21/09/23
- Maintain the same behavior of
websockets
from 10.4 on 11.0 (#2061) 30/07/23
- Add
typing_extensions
for Python 3.10 and lower (#2053) 18/07/23
- Add
--ws-max-queue
parameter WebSockets (#2033) 10/07/23
- Drop support for Python 3.7 (#1996) 19/06/23
- Remove
asgiref
as typing dependency (#1999) 08/06/23
- Set
scope["scheme"]
tows
orwss
instead ofhttp
orhttps
onProxyHeadersMiddleware
for WebSockets (#2043) 12/07/23
- Raise
ImportError
on circular import (#2040) 09/07/23 - Use
logger.getEffectiveLevel()
instead oflogger.level
to check if log level isTRACE
(#1966) 01/06/23
- Add
--timeout-graceful-shutdown
parameter (#1950) 26/04/23 - Handle
SIGBREAK
on Windows (#1909) 15/04/23
- Shutdown event is now being triggered on Windows when using hot reload (#1584) 13/04/23
--reload-delay
is effectively used on thewatchfiles
reloader (#1930) 22/04/23
- Reset lifespan state on each request (#1903) 16/03/23
- Introduce lifespan state (#1818) 05/03/23
- Allow headers to be sent as iterables on H11 implementation (#1782) 27/11/22
- Improve discoverability when --port=0 is used (#1890) 09/03/23
- Avoid importing
h11
andpyyaml
when not needed to improve import time (#1846) 07/02/23 - Replace current native
WSGIMiddleware
implementation bya2wsgi
(#1825) 16/01/23 - Change default
--app-dir
from "." (dot) to "" (empty string) (#1835) 06/01/23
- Send code 1012 on shutdown for WebSockets (#1816) 06/01/23
- Use
surrogateescape
to encode headers onwebsockets
implementation (#1005) 12/12/22 - Fix warning message on reload failure (#1784) 29/11/22
- Check if handshake is completed before sending frame on
wsproto
shutdown (#1737) - Add default headers to WebSockets implementations (#1606 & #1747) 28/10/22
- Warn user when
reload
andworkers
flag are used together (#1731) 31/10/22
- Use correct
WebSocket
error codes onclose
(#1753) 20/11/22 - Send disconnect event on connection lost for
wsproto
(#996) 29/10/22 - Add
SIGQUIT
handler toUvicornWorker
(#1710) 01/11/22 - Fix crash on exist with "--uds" if socket doesn't exist (#1725) 27/10/22
- Annotate
CONFIG_KWARGS
inUvicornWorker
class (#1746) 31/10/22
- Remove conditional on
RemoteProtocolError.event_hint
onwsproto
(#1486) 31/10/22 - Remove unused
handle_no_connect
onwsproto
implementation (#1759) 17/11/22
- Support Python 3.11 (#1652) 16/09/22
- Bump minimal
httptools
version to0.5.0
(#1645) 13/09/22 - Ignore HTTP/2 upgrade and optionally ignore WebSocket upgrade (#1661) 19/10/22
- Add
py.typed
to comply with PEP 561 (#1687) 07/10/22
- Set
propagate
toFalse
on "uvicorn" logger (#1288) 08/10/22 - USR1 signal is now handled correctly on
UvicornWorker
. (#1565) 26/08/22 - Use path with query string on
WebSockets
logs (#1385) 11/09/22 - Fix behavior on which "Date" headers were not updated on the same connection (#1706) 19/10/22
- Remove the
--debug
flag (#1640) 14/09/22 - Remove the
DebugMiddleware
(#1697) 07/10/22
- Remove cyclic references on HTTP implementations. (#1604) 24/08/22
reload_delay
default changed fromNone
to0.25
onuvicorn.run()
andConfig
.None
is not an acceptable value anymore. (#1545) 02/07/22
- Add default
log_config
onuvicorn.run()
(#1541) 24/06/22 - Revert
logging
file name modification (#1543) 27/06/22
- Use
DEFAULT_MAX_INCOMPLETE_EVENT_SIZE
as default toh11_max_incomplete_event_size
on the CLI (#1534) 23/06/22
- The
reload
flag prioritizeswatchfiles
instead of the deprecatedwatchgod
(#1437) 18/06/22 - Annotate
uvicorn.run()
function (#1423) 10/05/22 - Allow configuring
max_incomplete_event_size
forh11
implementation (#1514) 22/06/22
- Remove
asgiref
dependency (#1532) 22/06/22
- Turn
raw_path
into bytes on both websockets implementations (#1487) 16/05/22 - Revert log exception traceback in case of invalid HTTP request (#1518) 14/06/22
- Set
asyncio.WindowsSelectorEventLoopPolicy()
when using multiple workers to avoid "WinError 87" (#1454) 22/06/22
- Change
httptools
range to>=0.4.0
(#1400) 11/03/22
- Fix case where url is fragmented in httptools protocol (#1263) 16/02/22
- Fix WSGI middleware not to explode quadratically in the case of a larger body (#1329) 16/02/16
- Send HTTP 400 response for invalid request (#1352) 2/11/22
- Replace
create_server
bycreate_unix_server
(#1362) 04/02/22
- Drop wsproto version checking. (#1359) 03/02/22
- Revert #1332. While trying to solve the memory leak, it introduced an issue (#1345) when the server receives big chunks of data using the
httptools
implementation. (#1354) 03/02/22 - Revert stream interface changes. This was introduced on 0.14.0, and caused an issue (#1226), which caused a memory leak when sending TCP pings. (#1355) 03/02/22
- Fix wsproto version check expression (#1342) 28/01/22
- Move all data handling logic to protocol and ensure connection is closed. (#1332) 28/01/22
- Change
spec_version
field from "2.1" to "2.3", as Uvicorn is compliant with that version of the ASGI specifications. (#1337) 25/01/22
- Add the
python_requires
version specifier (#1328) 17/01/22
- Allow configurable websocket per-message-deflate setting (#1300) 29/12/21
- Support extra_headers for WS accept message (#1293) 06/01/22
- Add missing http version on websockets scope (#1309) 08/01/22
- Drop Python 3.6 support (#1261) 06/01/22
- Fix reload process behavior when exception is raised (#1313) 11/01/22
- Remove
root_path
from logs (#1294) 25/12/21
- Enable read of uvicorn settings from environment variables (#1279) 06/12/21
- Bump
websockets
to 10.0. (#1180) 13/09/21 - Ensure non-zero exit code when startup fails (#1278) 06/12/21
- Increase
httptools
version range from "==0.2.*" to ">=0.2.0,<0.4.0". (#1243) 8/11/21 - Override default asyncio event loop with reload only on Windows (#1257) 24/11/21
- Replace
HttpToolsProtocol.pipeline
type fromlist
todeque
. (#1213) 10/10/21 - Replace
WSGIResponder.send_queue
type fromlist
todeque
. (#1214) 10/10/21
- Main process exit after startup failure on reloader classes (#1177) 30/09/21
- Add explicit casting on click options (#1217) 11/10/21
- Allow WebSocket close event to receive reason being None from ASGI app. (#1259) 23/11/21
- Fix a bug in
WebSocketProtocol.asgi_receive
on which we returned a close frame even if there were data messages before that frame in the read queue. (#1252) 25/11/21 - The option
--reload-dirs
was splitting a string into single character directories. (#1267) 25/11/21 - Only second SIGINT is able to forcefully shutdown the server (#1269) 28/11/21
- Allow app-dir parameter on the run() function (#1271) 06/12/21
- Change reload to be configurable with glob patterns. Currently only
.py
files are watched, which is different from the previous default behavior. (#820) 08/08/21 - Add Python 3.10-rc.1 support. Now the server uses
asyncio.run
which will: start a fresh asyncio event loop, on shutdown cancel any background tasks rather than aborting them,aexit
any remaining async generators, and shutdown the defaultThreadPoolExecutor
. (#1070) 30/07/21 - Exit with status 3 when worker starts failed (#1077) 22/06/21
- Add option to set websocket ping interval and timeout (#1048) 09/06/21
- Adapt bind_socket to make it usable with multiple processes (#1009) 21/06/21
- Add existence check to the reload directory(ies) (#1089) 21/06/21
- Add missing trace log for websocket protocols (#1083) 19/06/21
- Support disabling default Server and Date headers (#818) 11/06/21
- Add PEP440 compliant version of click (#1099) 29/06/21
- Bump asgiref to 3.4.0 (#1100) 29/06/21
- When receiving a
SIGTERM
supervisors now terminate their processes before joining them (#1069) 30/07/21 - Fix the need of
httptools
on minimal installation (#1135) 30/07/21 - Fix ping parameters annotation in Config class (#1127) 19/07/21
- Defaults ws max_size on server to 16MB (#995) 5/29/21
- Improve user feedback if no ws library installed (#926 and #1023) 2/27/21
- Support 'reason' field in 'websocket.close' messages (#957) 2/24/21
- Implemented lifespan.shutdown.failed (#755) 2/25/21
- Upgraded websockets requirements (#1065) 6/1/21
- Switch to asyncio streams API (#869) 5/29/21
- Update httptools from 0.1.* to 0.2.* (#1024) 5/28/21
- Allow Click 8.0, refs #1016 (#1042) 5/23/21
- Add search for a trusted host in ProxyHeadersMiddleware (#591) 3/13/21
- Up wsproto to 1.0.0 (#892) 2/25/21
- Force reload_dirs to be a list (#978) 6/1/21
- Fix gunicorn worker not running if extras not installed (#901) 5/28/21
- Fix socket port 0 (#975) 3/5/21
- Prevent garbage collection of main lifespan task (#972) 3/4/21
- Fixed wsgi middleware PATH_INFO encoding (#962) 2/20/21
- Fixed uvloop dependency (#952) 2/10/21 then (#959) 2/20/21
- Relax watchgod up bound (#946) 1/31/21
- Return 'connection: close' header in response (#721) 1/25/21
- Docs: Nginx + websockets (#948) 2/10/21
- Document the default value of 1 for workers (#940) (#943) 1/25/21
- Enabled permessage-deflate extension in websockets (#764) 1/1/21
- Prevent swallowing of return codes from
subprocess
when running with Gunicorn by properly resetting signals. (Pull #895) - Tweak detection of app factories to be more robust. A warning is now logged when passing a factory without the
--factory
flag. (Pull #914) - Properly clean tasks when handshake is aborted when running with
--ws websockets
. (Pull #921)
- Log full exception traceback in case of invalid HTTP request. (Pull #886 and #888)
- Prevent exceptions when the ASGI application rejects a connection during the WebSocket handshake, when running on both
--ws wsproto
or--ws websockets
. (Pull #704 and #881) - Ensure connection
scope
doesn't leak in logs when using JSON log formatters. (Pull #859 and #884)
- Add
--factory
flag to support factory-style application imports. (#875) 2020-12-07 50fc0d1c - Skip installation of signal handlers when not in the main thread. Allows using
Server
in multithreaded contexts without having to override.install_signal_handlers()
. (#871) 2020-12-07 ce2ef45a
- Fix race condition that leads Quart to hang with uvicorn (#848) 11/18/20 de213614
- Use latin1 when decoding X-Forwarded-* headers (#701) 11/12/20 45e6e831
- Rework IPv6 support (#837) 11/8/20 bdab488e
- Cancel old keepalive-trigger before setting new one. (#832) 10/26/20 d5dcf80c
- Adding ability to decrypt ssl key file (#808) 10/12/20 90dbb6e0
- Support .yml log config files (#799) 10/6/20 b468950e
- Added python 3.9 support (#804) 10/6/20 08fd0559
- Fixes watchgod with common prefixes (#817) 10/14/20 1b32f997
- Fix reload with ipv6 host (#803) 10/14/20 5acaee5b
- Added cli support for headers containing colon (#813) 10/12/20 68732899
- Sharing socket across workers on windows (#802) 10/12/20 103167a0
- Note the need to configure trusted "ips" when using unix sockets (#796) 10/4/20 a504c569
- Pinning h11 and python-dotenv to min versions (#789) 9/29/20 bbf19c66
- Get docs/index.md in sync with README.md (#784) 9/29/20 70ebcfdf
- Improve changelog by pointing out breaking changes (#792) 9/29/20 e2b75064
- Make reload delay configurable (#774) 9/28/20 98010027
- Upgrade maximum h11 dependency version to 0.10 (#772) 8/28/20 54d729cc
- Allow .json or .yaml --log-config files (#665) 8/18/20 093a1f7c
- Add ASGI dict to the lifespan scope (#754) 8/15/20 8150c3eb
- Upgrade wsproto to 0.15.0 (#750) 8/13/20 fbce393f
- Use optional package installs (#666) 8/10/20 5fa99a11
- Dont set log level for root logger (#767) 8/28/20 df81b168
- Uvicorn no longer ships extra dependencies
uvloop
,websockets
andhttptools
as default. To install these dependencies useuvicorn[standard]
.
- Revert "Improve shutdown robustness when using
--reload
or multiprocessing (#620)" (#756) 8/28/20 ff4af12d - Fix terminate error in windows (#744) 8/27/20 dd3b842d
- Fix bug where --log-config disables uvicorn loggers (#512) 8/11/20 a9c37cc4
- Fix a regression that caused Uvicorn to crash when using
--interface=wsgi
. (Pull #730) - Fix a regression that caused Uvicorn to crash when using unix domain sockets. (Pull #729)
- SECURITY FIX: Prevent sending invalid HTTP header names and values. (Pull #725)
- SECURITY FIX: Ensure path value is escaped before logging to the console. (Pull #724)
- Fix
--proxy-headers
client IP and host when using a Unix socket. (Pull #636)
- Fix overriding the root logger.
- Revert "Watch all files, not just .py" due to unexpected side effects.
- Revert "Pass through gunicorn timeout config." due to unexpected side effects.
- Use
watchgod
, if installed, for watching code changes. - Watch all files, not just .py.
- Pass through gunicorn timeout config.
- Update dependencies.
- Don't open socket until after application startup.
- Support
--backlog
.
- Use a more liberal
h11
dependency. Either0.8.*
or `0.9.*``.
- Fix reload/multiprocessing on Windows with Python 3.8.
- Drop IOCP support. (Required for fix above.)
- Add
uvicorn --version
flag. - Add
--use-colors
and--no-use-colors
flags. - Display port correctly, when auto port selection isused with
--port=0
.
- Fix reload/multiprocessing error.
- Use resource_sharer.DupSocket to resolve socket sharing on Windows.
- Exit if
workers
orreload
are use without an app import string style. - Reorganise supervisor processes to properly hand over sockets on windows.
- Update uvloop dependency to 0.14+
- Error clearly when
workers=<NUM>
is used with app instance, instead of an app import string. - Switch
--reload-dir
to current working directory by default.
- Add ``--log-level trace`
- Enable --proxy-headers by default.
- Resolve issues with logging when using
--reload
or--workers
. - Setup up root logger to capture output for all logger instances, not just
uvicorn.error
anduvicorn.access
.
- Support for Python 3.8
- Separated out
uvicorn.error
anduvicorn.access
logs. - Coloured log output when connected to a terminal.
- Dropped
logger=
config setting. - Added
--log-config [FILE]
andlog_config=[str|dict]
. May either be a Python logging config dictionary or the file name of a logging configuration. - Added
--forwarded_allow_ips
andforwarded_allow_ips
. Defaults to the value of the$FORWARDED_ALLOW_IPS
environment variable or "127.0.0.1". The--proxy-headers
flag now defaults toTrue
, but only trusted IPs are used to populate forwarding info. - The
--workers
setting now defaults to the value of the$WEB_CONCURRENCY
environment variable. - Added support for
--env-file
. Requirespython-dotenv
.