📜 Changelog

🔶 Current release
🔷 In support release

Version 23.6.0 🔶


  • #2670 Increase KEEP_ALIVE_TIMEOUT default to 120 seconds

  • #2716 Adding allow route overwrite option in blueprint

  • #2724 and #2792 Add a new exception signal for ALL exceptions raised anywhere in application

  • #2727 Add name prefixing to BP groups

  • #2754 Update request type on middleware types

  • #2770 Better exception message on startup time application induced import error

  • #2776 Set multiprocessing start method early

  • #2785 Add custom typing to config and ctx objects

  • #2790 Add request.client_ip


  • #2728 Fix traversals for intended results

  • #2729 Handle case when headers argument of ResponseStream constructor is None

  • #2737 Fix type annotation for JSONREsponse default content type

  • #2740 Use Sanic’s serializer for JSON responses in the Inspector

  • #2760 Support for Request.get_current in ASGI mode

  • #2773 Alow Blueprint routes to explicitly define error_format

  • #2774 Resolve headers on different renderers

  • #2782 Resolve pypy compatibility issues

Deprecations and Removals

  • #2777 Remove Python 3.7 support

Developer infrastructure

  • #2766 Unpin setuptools version

  • #2779 Run keep alive tests in loop to get available port

Improved Documentation

  • #2741 Better documentation examples about running Sanic From that list, the items to highlight in the release notes:

Version 23.3.0


  • #2545 Standardize init of exceptions for more consistent control of HTTP responses using exceptions

  • #2606 Decode headers as UTF-8 also in ASGI

  • #2646 Separate ASGI request and lifespan callables

  • #2659 Use FALLBACK_ERROR_FORMAT for handlers that return empty()

  • #2662 Add basic file browser (HTML page) and auto-index serving

  • #2667 Nicer traceback formatting (HTML page)

  • #2668 Smarter error page rendering format selection; more reliant upon header and “common sense” defaults

  • #2680 Check the status of socket before shutting down with SHUT_RDWR

  • #2687 Refresh Request.accept functionality to be more performant and spec-compliant

  • #2696 Add header accessors as properties

    Example-Field: Foo, Bar
    Example-Field: Baz
    request.headers.example_field == "Foo, Bar,Baz"
  • #2700 Simpler CLI targets

    $ sanic path.to.module:app          # global app instance
    $ sanic path.to.module:create_app   # factory pattern
    $ sanic ./path/to/directory/        # simple serve
  • #2701 API to define a number of workers in managed processes

  • #2704 Add convenience for dynamic changes to routing

  • #2706 Add convenience methods for cookie creation and deletion

    response = text("...")
    response.add_cookie("test", "It worked!", domain=".yummy-yummy-cookie.com")
  • #2707 Simplified parse_content_header escaping to be RFC-compliant and remove outdated FF hack

  • #2710 Stricter charset handling and escaping of request URLs

  • #2711 Consume body on DELETE by default

  • #2719 Allow password to be passed to TLS context

  • #2720 Skip middleware on RequestCancelled

  • #2721 Change access logging format to %s

  • #2722 Add CertLoader as application option for directly controlling SSLContext objects

  • #2725 Worker sync state tolerance on race condition


  • #2651 ASGI websocket to pass thru bytes as is

  • #2697 Fix comparison between datetime aware and naive in file when using If-Modified-Since

Deprecations and Removals

  • #2666 Remove deprecated __blueprintname__ property

Improved Documentation

  • #2712 Improved example using 'https' to create the redirect

Version 22.12.0 🔷

Current version


  • #2569 Add JSONResponse class with some convenient methods when updating a response object

  • #2598 Change uvloop requirement to >=0.15.0

  • #2609 Add compatibility with websockets v11.0

  • #2610 Kill server early on worker error

    • Raise deadlock timeout to 30s

  • #2617 Scale number of running server workers

  • #2621 #2634 Send SIGKILL on subsequent ctrl+c to force worker exit

  • #2622 Add API to restart all workers from the multiplexer

  • #2624 Default to spawn for all subprocesses unless specifically set:

    from sanic import Sanic
    Sanic.start_method = "fork"
  • #2625 Filename normalisation of form-data/multipart file uploads

  • #2626 Move to HTTP Inspector:

    • Remote access to inspect running Sanic instances

    • TLS support for encrypted calls to Inspector

    • Authentication to Inspector with API key

    • Ability to extend Inspector with custom commands

  • #2632 Control order of restart operations

  • #2633 Move reload interval to class variable

  • #2636 Add priority to register_middleware method

  • #2639 Add unquote to add_route method

  • #2640 ASGI websockets to receive text or bytes


  • #2607 Force socket shutdown before close to allow rebinding

  • #2590 Use actual StrEnum in Python 3.11+

  • #2615 Ensure middleware executes only once per request timeout

  • #2627 Crash ASGI application on lifespan failure

  • #2635 Resolve error with low-level server creation on Windows

Deprecations and Removals

  • #2608 #2630 Signal conditions and triggers saved on signal.extra

  • #2626 Move to HTTP Inspector

    • 🚨 BREAKING CHANGE: Moves the Inspector to a Sanic app from a simple TCP socket with a custom protocol

    • DEPRECATE: The --inspect* commands have been deprecated in favor of inspect ... commands

  • #2628 Replace deprecated distutils.strtobool

Developer infrastructure

  • #2612 Add CI testing for Python 3.11

Version 22.9.1


  • #2585 Improved error message when no applications have been registered


  • #2578 Add certificate loader for in process certificate creation

  • #2591 Do not use sentinel identity for spawn compatibility

  • #2592 Fix properties in nested blueprint groups

  • #2595 Introduce sleep interval on new worker reloader

Deprecations and Removals

Developer infrastructure

  • #2588 Markdown templates on issue forms

Improved Documentation

  • #2556 v22.9 documentation

  • #2582 Cleanup documentation on Windows support

Version 22.9.0


  • #2445 Add custom loads function

  • #2490 Make WebsocketImplProtocol async iterable

  • #2499 Sanic Server WorkerManager refactor

  • #2506 Use pathlib for path resolution (for static file serving)

  • #2508 Use path.parts instead of match (for static file serving)

  • #2513 Better request cancel handling

  • #2516 Add request properties for HTTP method info:

    • request.is_safe

    • request.is_idempotent

    • request.is_cacheable

    • See MDN docs for more information about when these apply

  • #2522 Always show server location in ASGI

  • #2526 Cache control support for static files for returning 304 when appropriate

  • #2533 Refactor _static_request_handler

  • #2540 Add signals before and after handler execution

    • http.handler.before

    • http.handler.after

  • #2542 Add [redacted] to CLI :)

  • #2546 Add deprecation warning filter

  • #2550 Middleware priority and performance enhancements


  • #2495 Prevent directory traversion with static files

  • #2515 Do not apply double slash to paths in certain static dirs in Blueprints

Deprecations and Removals

  • #2525 Warn on duplicate route names, will be prevented outright in v23.3

  • #2537 Raise warning and deprecation notice on duplicate exceptions, will be prevented outright in v23.3

Developer infrastructure

  • #2504 Cleanup test suite

  • #2505 Replace Unsupported Python Version Number from the Contributing Doc

  • #2530 Do not include tests folder in installed package resolver

Improved Documentation

Version 22.6.2


  • #2522 Always show server location in ASGI

Version 22.6.1


  • #2477 Sanic static directory fails when folder name ends with “..”

Version 22.6.0


  • #2378 Introduce HTTP/3 and autogeneration of TLS certificates in DEBUG mode

    • 👶 EARLY RELEASE FEATURE: Serving Sanic over HTTP/3 is an early release feature. It does not yet fully cover the HTTP/3 spec, but instead aims for feature parity with Sanic’s existing HTTP/1.1 server. Websockets, WebTransport, push responses are examples of some features not yet implemented.

    • 📦 EXTRA REQUIREMENT: Not all HTTP clients are capable of interfacing with HTTP/3 servers. You may need to install a HTTP/3 capable client.

    • 📦 EXTRA REQUIREMENT: In order to use TLS autogeneration, you must install either mkcert or trustme.

  • #2416 Add message to task.cancel

  • #2420 Add exception aliases for more consistent naming with standard HTTP response types (BadRequest, MethodNotAllowed, RangeNotSatisfiable)

  • #2432 Expose ASGI scope as a property on the Request object

  • #2438 Easier access to websocket class for annotation: from sanic import Websocket

  • #2439 New API for reading form values with options: Request.get_form

  • #2445 Add custom loads function

  • #2447, #2486 Improved API to support setting cache control headers

  • #2453 Move verbosity filtering to logger

  • #2475 Expose getter for current request using Request.get_current()


  • #2448 Fix to allow running with pythonw.exe or places where there is no sys.stdout

  • #2451 Trigger http.lifecycle.request signal in ASGI mode

  • #2455 Resolve typing of stacked route definitions

  • #2463 Properly catch websocket CancelledError in websocket handler in Python 3.7

Deprecations and Removals

  • #2487 v22.6 deprecations and changes

    1. Optional application registry

    2. Execution of custom handlers after some part of response was sent

    3. Configuring fallback handlers on the ErrorHandler

    4. Custom LOGO setting

    5. sanic.response.stream

    6. AsyncioServer.init

Developer infrastructure

  • #2449 Clean up black and isort config

  • #2479 Fix some flappy tests

Improved Documentation

  • #2461 Update example to match current application naming standards

  • #2466 Better type annotation for Extend

  • #2485 Improved help messages in CLI

Version 22.3.0


  • #2347 API for multi-application server

    • 🚨 BREAKING CHANGE: The old sanic.worker.GunicornWorker has been removed. To run Sanic with gunicorn, you should use it thru uvicorn as described in their docs.

    • 🧁 SIDE EFFECT: Named background tasks are now supported, even in Python 3.7

  • #2357 Parse Authorization header as Request.credentials

  • #2361 Add config option to skip Touchup step in application startup

  • #2372 Updates to CLI help messaging

  • #2382 Downgrade warnings to backwater debug messages

  • #2396 Allow for multidict v0.6

  • #2401 Upgrade CLI catching for alternative application run types

  • #2402 Conditionally inject CLI arguments into factory

  • #2413 Add new start and stop event listeners to reloader process

  • #2414 Remove loop as required listener arg

  • #2415 Better exception for bad URL parsing

  • sanic-routing#47 Add a new extention parameter type: <file:ext>, <file:ext=jpg>, <file:ext=jpg|png|gif|svg>, <file=int:ext>, <file=int:ext=jpg|png|gif|svg>, <file=float:ext=tar.gz>

    • 👶 BETA FEATURE: This feature will not work with path type matching, and is being released as a beta feature only.

  • sanic-routing#57 Change register_pattern to accept a str or Pattern

  • sanic-routing#58 Default matching on non-empty strings only, and new strorempty pattern type

    • 🚨 BREAKING CHANGE: Previously a route with a dynamic string parameter (/<foo> or /<foo:str>) would match on any string, including empty strings. It will now only match a non-empty string. To retain the old behavior, you should use the new parameter type: /<foo:strorempty>.


  • #2373 Remove error_logger on websockets

  • #2381 Fix newly assigned None in task registry

  • sanic-routing#52 Add type casting to regex route matching

  • sanic-routing#60 Add requirements check on regex routes (this resolves, for example, multiple static directories with differing host values)

Deprecations and Removals

  • #2362 22.3 Deprecations and changes

    1. debug=True and --debug do NOT automatically run auto_reload

    2. Default error render is with plain text (browsers still get HTML by default because auto looks at headers)

    3. config is required for ErrorHandler.finalize

    4. ErrorHandler.lookup requires two positional args

    5. Unused websocket protocol args removed

  • #2344 Deprecate loading of lowercase environment variables

Developer infrastructure

Improved Documentation

  • #2350 Fix link in README for ASGI

  • #2398 Document middleware on_request and on_response

  • #2409 Add missing documentation for Request.respond


  • #2376 Fix typing for ListenerMixin.listener

  • #2383 Clear deprecation warning in asyncio.wait

  • #2387 Cleanup __slots__ implementations

  • #2390 Clear deprecation warning in asyncio.get_event_loop

Version 21.12.1 🔷

Current LTS version

  • #2349 Only display MOTD on startup

  • #2354 Ignore name argument in Python 3.7

  • #2355 Add config.update support for all config values

Version 21.12.0 🔹


  • #2260 Allow early Blueprint registrations to still apply later added objects

  • #2262 Noisy exceptions - force logging of all exceptions

  • #2264 Optional uvloop by configuration

  • #2270 Vhost support using multiple TLS certificates

  • #2277 Change signal routing for increased consistency

    • BREAKING CHANGE: If you were manually routing signals there is a breaking change. The signal router’s get is no longer 100% determinative. There is now an additional step to loop thru the returned signals for proper matching on the requirements. If signals are being dispatched using app.dispatch or bp.dispatch, there is no change.

  • #2290 Add contextual exceptions

  • #2291 Increase join concat performance

  • #2295, #2316, #2331 Restructure of CLI and application state with new displays and more command parity with app.run

  • #2302 Add route context at definition time

  • #2304 Named tasks and new API for managing background tasks

  • #2307 On app auto-reload, provide insight of changed files

  • #2308 Auto extend application with Sanic Extensions if it is installed, and provide first class support for accessing the extensions

  • #2309 Builtin signals changed to Enum

  • #2313 Support additional config implementation use case

  • #2321 Refactor environment variable hydration logic

  • #2327 Prevent sending multiple or mixed responses on a single request

  • #2330 Custom type casting on environment variables

  • #2332 Make all deprecation notices consistent

  • #2335 Allow underscore to start instance names


  • #2273 Replace assignation by typing for websocket_handshake

  • #2285 Fix IPv6 display in startup logs

  • #2299 Dispatch http.lifecyle.response from exception handler

Deprecations and Removals

  • #2306 Removal of deprecated items

    • Sanic and Blueprint may no longer have arbitrary properties attached to them

    • Sanic and Blueprint forced to have compliant names

      • alphanumeric + _ + -

      • must start with letter or _

    • load_env keyword argument of Sanic

    • sanic.exceptions.abort

    • sanic.views.CompositionView

    • sanic.response.StreamingHTTPResponse

  • #2320 Remove app instance from Config for error handler setting

Developer infrastructure

  • #2251 Change dev install command

  • #2286 Change codeclimate complexity threshold from 5 to 10

  • #2287 Update host test function names so they are not overwritten

  • #2292 Fail CI on error

  • #2311, #2324 Do not run tests for draft PRs

  • #2336 Remove paths from coverage checks

  • #2338 Cleanup ports on tests

Improved Documentation


Version 21.9.3

Rerelease of v21.9.2 with some cleanup

Version 21.9.2

  • #2268 Make HTTP connections start in IDLE stage, avoiding delays and error messages

  • #2310 More consistent config setting with post-FALLBACK_ERROR_FORMAT apply

Version 21.9.1

  • #2259 Allow non-conforming ErrorHandlers

Version 21.9.0


  • #2158, #2248 Complete overhaul of I/O to websockets

  • #2160 Add new 17 signals into server and request lifecycles

  • #2162 Smarter auto fallback formatting upon exception

  • #2184 Introduce implementation for copying a Blueprint

  • #2200 Accept header parsing

  • #2207 Log remote address if available

  • #2209 Add convenience methods to BP groups

  • #2216 Add default messages to SanicExceptions

  • #2225 Type annotation convenience for annotated handlers with path parameters

  • #2236 Allow Falsey (but not-None) responses from route handlers

  • #2238 Add exception decorator to Blueprint Groups

  • #2244 Explicit static directive for serving file or dir (ex: static(..., resource_type="file"))

  • #2245 Close HTTP loop when connection task cancelled


  • #2188 Fix the handling of the end of a chunked request

  • #2195 Resolve unexpected error handling on static requests

  • #2208 Make blueprint-based exceptions attach and trigger in a more intuitive manner

  • #2211 Fixed for handling exceptions of asgi app call

  • #2213 Fix bug where ws exceptions not being logged

  • #2231 Cleaner closing of tasks by using abort() in strategic places to avoid dangling sockets

  • #2247 Fix logging of auto-reload status in debug mode

  • #2246 Account for BP with exception handler but no routes

Developer infrastructure

  • #2194 HTTP unit tests with raw client

  • #2199 Switch to codeclimate

  • #2214 Try Reopening Windows Tests

  • #2229 Refactor HttpProtocol into a base class

  • #2230 Refactor server.py into multi-file module


  • #2173 Remove Duplicated Dependencies and PEP 517 Support

  • #2193, #2196, #2217 Type annotation changes


CHANGELOG files are maintained in ./docs/sanic/releases. To view the full CHANGELOG, please visit https://sanic.readthedocs.io/en/stable/sanic/changelog.html.

Version 21.6.1


  • #2178 Update sanic-routing to allow for better splitting of complex URI templates

  • #2183 Proper handling of chunked request bodies to resolve phantom 503 in logs

  • #2181 Resolve regression in exception logging

  • #2201 Cleanup request info in pipelined requests

Version 21.6.0


  • #2094 Add response.eof() method for closing a stream in a handler

  • #2097 Allow case-insensitive HTTP Upgrade header

  • #2104 Explicit usage of CIMultiDict getters

  • #2109 Consistent use of error loggers

  • #2114 New client_ip access of connection info instance

  • #2119 Alternatate classes on instantiation for Config and Sanic.ctx

  • #2133 Implement new version of AST router

    • Proper differentiation between alpha and string param types

    • Adds a slug param type, example: <foo:slug>

    • Deprecates <foo:string> in favor of <foo:str>

    • Deprecates <foo:number> in favor of <foo:float>

    • Adds a route.uri accessor

  • #2136 CLI improvements with new optional params

  • #2137 Add version_prefix to URL builders

  • #2140 Event autoregistration with EVENT_AUTOREGISTER

  • #2146, #2147 Require stricter names on Sanic() and Blueprint()

  • #2150 Infinitely reusable and nestable Blueprint and BlueprintGroup

  • #2154 Upgrade websockets dependency to min version

  • #2155 Allow for maximum header sizes to be increased: REQUEST_MAX_HEADER_SIZE

  • #2157 Allow app factory pattern in CLI

  • #2165 Change HTTP methods to enums

  • #2167 Allow auto-reloading on additional directories

  • #2168 Add simple HTTP server to CLI

  • #2170 Additional methods for attaching HTTPMethodView


  • #2091 Fix UserWarning in ASGI mode for missing __slots__

  • #2099 Fix static request handler logging exception on 404

  • #2110 Fix request.args.pop removes parameters inconsistently

  • #2107 Fix type hinting for load_env

  • #2127 Make sure ASGI ws subprotocols is a list

  • #2128 Fix issue where Blueprint exception handlers do not consistently route to proper handler

Deprecations and Removals

  • #2156 Remove config value REQUEST_BUFFER_QUEUE_SIZE

  • #2170 CompositionView deprecated and marked for removal in 21.12

  • #2172 Deprecate StreamingHTTPResponse

Developer infrastructure

  • #2149 Remove Travis CI in favor of GitHub Actions

Improved Documentation

  • #2164 Fix typo in documentation

  • #2100 Remove documentation for non-existent arguments

Version 21.3.2


  • #2081 Disable response timeout on websocket connections

  • #2085 Make sure that blueprints with no slash is maintained when applied

Version 21.3.1


  • #2076 Static files inside subfolders are not accessible (404)

Version 21.3.0

Release Notes


  • #1876 Unified streaming server

  • #2005 New Request.id property

  • #2008 Allow Pathlib Path objects to be passed to app.static() helper

  • #2010, #2031 New startup-optimized router

  • #2018 #2064 Listeners for main server process

  • #2032 Add raw header info to request object

  • #2042 #2060 #2061 Introduce Signals API

  • #2043 Add __str__ and __repr__ to Sanic and Blueprint

  • #2047 Enable versioning and strict slash on BlueprintGroup

  • #2053 Make get_app name argument optional

  • #2055 JSON encoder change via app

  • #2063 App and connection level context objects


  • Resolve #1420 url_for where strict_slashes are on for a path ending in /

  • Resolve #1525 Routing is incorrect with some special characters

  • Resolve #1653 ASGI headers in body

  • Resolve #1722 Using curl in chunk mode

  • Resolve #1730 Extra content in ASGI streaming response

  • Resolve #1749 Restore broken middleware edge cases

  • Resolve #1785 #1804 Synchronous error handlers

  • Resolve #1790 Protocol errors did not support async error handlers #1790

  • Resolve #1824 Timeout on specific methods

  • Resolve #1875 Response timeout error from all routes after returning several timeouts from a specific route

  • Resolve #1988 Handling of safe methods with body

  • #2001 Raise ValueError when cookie max-age is not an integer

Deprecations and Removals

  • #2007
    • Config using from_envvar

    • Config using from_pyfile

    • Config using from_object

  • #2009 Remove Sanic test client to its own package

  • #2036, #2037 Drop Python 3.6 support

  • Request.endpoint deprecated in favor of Request.name

  • handler type name prefixes removed (static, websocket, etc)

Developer infrastructure

  • #1995 Create FUNDING.yml

  • #2013 Add codeql to CI pipeline

  • #2038 Codecov configuration updates

  • #2049 Updated setup.py to use find_packages

Improved Documentation

  • #1218 Documentation for sanic.log.* is missing

  • #1608 Add documentation on calver and LTS

  • #1731 Support mounting application elsewhere than at root path

  • #2006 Upgraded type annotations and improved docstrings and API documentation

  • #2052 Fix some examples and docs


  • Request.route property

  • Better websocket subprotocols support

  • Resolve bug with middleware in Blueprint Group when passed callable

  • Moves common logic between Blueprint and Sanic into mixins

  • Route naming changed to be more consistent
    • request endpoint is the route name

    • route names are fully namespaced

  • Some new convenience decorators:
    • @app.main_process_start

    • @app.main_process_stop

    • @app.before_server_start

    • @app.after_server_start

    • @app.before_server_stop

    • @app.after_server_stop

    • @app.on_request

    • @app.on_response

  • Fixes Allow header that did not include HEAD

  • Using “name” keyword in url_for for a “static” route where name does not exist

  • Cannot have multiple app.static() without using the named param

  • Using “filename” keyword in url_for on a file route

  • unquote in route def (not automatic)

  • routes_all is tuples

  • Handler arguments are kwarg only

  • request.match_info is now a cached (and not computed) property

  • Unknown static file mimetype is sent as application/octet-stream

  • _host keyword in url_for

  • Add charset default to utf-8 for text and js content types if not specified

  • Version for a route can be str, float, or int

  • Route has ctx property

  • App has routes_static, routes_dynamic, routes_regex

  • #2044 Code cleanup and refactoring

  • #2072 Remove BaseSanic metaclass

  • #2074 Performance adjustments in handle_request_

Version 20.12.3


  • #2021 Remove prefix from websocket handler name

Version 20.12.2


  • #2026 Fix uvloop to 0.14 because 0.15 drops Python 3.6 support

  • #2029 Remove old chardet requirement, add in hard multidict requirement

Version 19.12.5


  • #2025 Fix uvloop to 0.14 because 0.15 drops Python 3.6 support

  • #2027 Remove old chardet requirement, add in hard multidict requirement

Version 20.12.0


  • #1993 Add disable app registry

  • #1945 Static route more verbose if file not found

  • #1954 Fix static routes registration on a blueprint

  • #1961 Add Python 3.9 support

  • #1962 Sanic CLI upgrade

  • #1967 Update aiofile version requirements

  • #1969 Update multidict version requirements

  • #1970 Add py.typed file

  • #1972 Speed optimization in request handler

  • #1979 Add app registry and Sanic class level app retrieval


  • #1965 Fix Chunked Transport-Encoding in ASGI streaming response

Deprecations and Removals

  • #1981 Cleanup and remove deprecated code

Developer infrastructure

  • #1956 Fix load module test

  • #1973 Transition Travis from .org to .com

  • #1986 Update tox requirements

Improved Documentation

  • #1951 Documentation improvements

  • #1983 Remove duplicate contents in testing.rst

  • #1984 Fix typo in routing.rst

Version 20.9.1


  • #1954 Fix static route registration on blueprints

  • #1957 Removes duplicate headers in ASGI streaming body

Version 19.12.3


  • #1959 Removes duplicate headers in ASGI streaming body

Version 20.9.0


  • #1887 Pass subprotocols in websockets (both sanic server and ASGI)

  • #1894 Automatically set test_mode flag on app instance

  • #1903 Add new unified method for updating app values

  • #1906, #1909 Adds WEBSOCKET_PING_TIMEOUT and WEBSOCKET_PING_INTERVAL configuration values

  • #1935 httpx version dependency updated, it is slated for removal as a dependency in v20.12

  • #1937 Added auto, text, and json fallback error handlers (in v21.3, the default will change form html to auto)


  • #1897 Resolves exception from unread bytes in stream

Deprecations and Removals

  • #1903 config.from_envar, config.from_pyfile, and config.from_object are deprecated and set to be removed in v21.3

Developer infrastructure

  • #1890, #1891 Update isort calls to be compatible with new API

  • #1893 Remove version section from setup.cfg

  • #1924 Adding –strict-markers for pytest

Improved Documentation

  • #1922 Add explicit ASGI compliance to the README

Version 20.6.3


  • #1884 Revert change to multiprocessing mode

Version 20.6.2


  • #1641 Socket binding implemented properly for IPv6 and UNIX sockets

Version 20.6.1


  • #1760 Add version parameter to websocket routes

  • #1866 Add sanic as an entry point command

  • #1880 Add handler names for websockets for url_for usage


  • #1776 Bug fix for host parameter issue with lists

  • #1842 Fix static _handler pickling error

  • #1827 Fix reloader on OSX py38 and Windows

  • #1848 Reverse named_response_middlware execution order, to match normal response middleware execution order

  • #1853 Fix pickle error when attempting to pickle an application which contains websocket routes

Deprecations and Removals

  • #1739 Deprecate body_bytes to merge into body

Developer infrastructure

  • #1852 Fix naming of CI test env on Python nightlies

  • #1857 Adjust websockets version to setup.py

  • #1869 Wrap run()’s “protocol” type annotation in Optional[]

Improved Documentation

  • #1846 Update docs to clarify response middleware execution order

  • #1865 Fixing rst format issue that was hiding documentation

Version 20.6.0

Released, but unintentionally omitting PR #1880, so was replaced by 20.6.1

Version 20.3.0


  • #1762 Add srv.start_serving() and srv.serve_forever() to AsyncioServer

  • #1767 Make Sanic usable on hypercorn -k trio myweb.app

  • #1768 No tracebacks on normal errors and prettier error pages

  • #1769 Code cleanup in file responses

  • #1793 and #1819 Upgrade str.format() to f-strings

  • #1798 Allow multiple workers on MacOS with Python 3.8

  • #1820 Do not set content-type and content-length headers in exceptions


  • #1748 Remove loop argument in asyncio.Event in Python 3.8

  • #1764 Allow route decorators to stack up again

  • #1789 Fix tests using hosts yielding incorrect url_for

  • #1808

    Fix Ctrl+C and tests on Windows

Deprecations and Removals

  • #1800 Begin deprecation in way of first-class streaming, removal of body_init, body_push, and body_finish

  • #1801 Complete deprecation from #1666 of dictionary context on request objects.

  • #1807 Remove server config args that can be read directly from app

  • #1818 Complete deprecation of app.remove_route and request.raw_args


  • #1794 Bump httpx to 0.11.1

  • #1806 Import ASGIDispatch from top-level httpx (from third-party deprecation)

Developer infrastructure

  • #1833 Resolve broken documentation builds

Improved Documentation

  • #1755 Usage of response.empty()

  • #1778 Update README

  • #1783 Fix typo

  • #1784 Corrected changelog for docs move of MD to RST (#1691)

  • #1803 Update config docs to match DEFAULT_CONFIG

  • #1814 Update getting_started.rst

  • #1821 Update to deployment

  • #1822 Update docs with changes done in 20.3

  • #1834 Order of listeners

Version 19.12.0


  • Fix blueprint middleware application

    Currently, any blueprint middleware registered, irrespective of which blueprint was used to do so, was being applied to all of the routes created by the @app and @blueprint alike.

    As part of this change, the blueprint based middleware application is enforced based on where they are registered.

    • If you register a middleware via @blueprint.middleware then it will apply only to the routes defined by the blueprint.

    • If you register a middleware via @blueprint_group.middleware then it will apply to all blueprint based routes that are part of the group.

    • If you define a middleware via @app.middleware then it will be applied on all available routes (#37)

  • Fix url_for behavior with missing SERVER_NAME

    If the SERVER_NAME was missing in the app.config entity, the url_for on the request and app were failing due to an AttributeError. This fix makes the availability of SERVER_NAME on our app.config an optional behavior. (#1707)

Improved Documentation

  • Move docs from MD to RST

    Moved all docs from markdown to restructured text like the rest of the docs to unify the scheme and make it easier in the future to update documentation. (#1691)

  • Fix documentation for get and getlist of the request.args

    Add additional example for showing the usage of getlist and fix the documentation string for request.args behavior (#1704)

Version 19.6.3


  • Enable Towncrier Support

    As part of this feature, towncrier is being introduced as a mechanism to partially automate the process of generating and managing change logs as part of each of pull requests. (#1631)

Improved Documentation

  • Documentation infrastructure changes

    • Enable having a single common CHANGELOG file for both GitHub page and documentation

    • Fix Sphinix deprecation warnings

    • Fix documentation warnings due to invalid rst indentation

    • Enable common contribution guidelines file across GitHub and documentation via CONTRIBUTING.rst (#1631)

Version 19.6.2


  • #1562 Remove aiohttp dependency and create new SanicTestClient based upon requests-async

  • #1475 Added ASGI support (Beta)

  • #1436 Add Configure support from object string


  • #1587 Add missing handle for Expect header.

  • #1560 Allow to disable Transfer-Encoding: chunked.

  • #1558 Fix graceful shutdown.

  • #1594 Strict Slashes behavior fix

Deprecations and Removals

  • #1544 Drop dependency on distutil

  • #1562 Drop support for Python 3.5

  • #1568 Deprecate route removal.


Sanic will not support Python 3.5 from version 19.6 and forward. However, version 18.12LTS will have its support period extended thru December 2020, and therefore passing Python’s official support version 3.5, which is set to expire in September 2020.

Version 19.3


  • #1497 Add support for zero-length and RFC 5987 encoded filename for multipart/form-data requests.

  • #1484 The type of expires attribute of sanic.cookies.Cookie is now enforced to be of type datetime.

  • #1482 Add support for the stream parameter of sanic.Sanic.add_route() available to sanic.Blueprint.add_route().

  • #1481 Accept negative values for route parameters with type int or number.

  • #1476 Deprecated the use of sanic.request.Request.raw_args - it has a fundamental flaw in which is drops repeated query string parameters. Added sanic.request.Request.query_args as a replacement for the original use-case.

  • #1472 Remove an unwanted None check in Request class repr implementation. This changes the default repr of a Request from <Request> to <Request: None />

  • #1470 Added 2 new parameters to sanic.app.Sanic.create_server:

    • return_asyncio_server - whether to return an asyncio.Server.

    • asyncio_server_kwargs - kwargs to pass to loop.create_server for the event loop that sanic is using.

    This is a breaking change.

  • #1499 Added a set of test cases that test and benchmark route resolution.

  • #1457 The type of the "max-age" value in a sanic.cookies.Cookie is now enforced to be an integer. Non-integer values are replaced with 0.

  • #1445 Added the endpoint attribute to an incoming request, containing the name of the handler function.

  • #1423 Improved request streaming. request.stream is now a bounded-size buffer instead of an unbounded queue. Callers must now call await request.stream.read() instead of await request.stream.get() to read each portion of the body.

    This is a breaking change.


  • #1502 Sanic was prefetching time.time() and updating it once per second to avoid excessive time.time() calls. The implementation was observed to cause memory leaks in some cases. The benefit of the prefetch appeared to negligible, so this has been removed. Fixes #1500

  • #1501 Fix a bug in the auto-reloader when the process was launched as a module i.e. python -m init0.mod1 where the sanic server is started in init0/mod1.py with debug enabled and imports another module in init0.

  • #1376 Allow sanic test client to bind to a random port by specifying port=None when constructing a SanicTestClient

  • #1399 Added the ability to specify middleware on a blueprint group, so that all routes produced from the blueprints in the group have the middleware applied.

  • #1442 Allow the the use the SANIC_ACCESS_LOG environment variable to enable/disable the access log when not explicitly passed to app.run(). This allows the access log to be disabled for example when running via gunicorn.

Developer infrastructure

  • #1529 Update project PyPI credentials

  • #1515 fix linter issue causing travis build failures (fix #1514)

  • #1490 Fix python version in doc build

  • #1478 Upgrade setuptools version and use native docutils in doc build

  • #1464 Upgrade pytest, and fix caplog unit tests

Improved Documentation

  • #1516 Fix typo at the exception documentation

  • #1510 fix typo in Asyncio example

  • #1486 Documentation typo

  • #1477 Fix grammar in README.md

  • #1489 Added “databases” to the extensions list

  • #1483 Add sanic-zipkin to extensions list

  • #1487 Removed link to deleted repo, Sanic-OAuth, from the extensions list

  • #1460 18.12 changelog

  • #1449 Add example of amending request object

  • #1446 Update README

  • #1444 Update README

  • #1443 Update README, including new logo

  • #1440 fix minor type and pip install instruction mismatch

  • #1424 Documentation Enhancements

Note: 19.3.0 was skipped for packagement purposes and not released on PyPI

Version 18.12

  • Changes:

    • Improved codebase test coverage from 81% to 91%.

    • Added stream_large_files and host examples in static_file document

    • Added methods to append and finish body content on Request (#1379)

    • Integrated with .appveyor.yml for windows ci support

    • Added documentation for AF_INET6 and AF_UNIX socket usage

    • Adopt black/isort for codestyle

    • Cancel task when connection_lost

    • Simplify request ip and port retrieval logic

    • Handle config error in load config file.

    • Integrate with codecov for CI

    • Add missed documentation for config section.

    • Deprecate Handler.log

    • Pinned httptools requirement to version 0.0.10+

  • Fixes:

    • Fix remove_entity_headers helper function (#1415)

    • Fix TypeError when use Blueprint.group() to group blueprint with default url_prefix, Use os.path.normpath to avoid invalid url_prefix like api//v1 f8a6af1 Rename the http module to helpers to prevent conflicts with the built-in Python http library (fixes #1323)

    • Fix unittests on windows

    • Fix Namespacing of sanic logger

    • Fix missing quotes in decorator example

    • Fix redirect with quoted param

    • Fix doc for latest blueprint code

    • Fix build of latex documentation relating to markdown lists

    • Fix loop exception handling in app.py

    • Fix content length mismatch in windows and other platform

    • Fix Range header handling for static files (#1402)

    • Fix the logger and make it work (#1397)

    • Fix type pikcle->pickle in multiprocessing test

    • Fix pickling blueprints Change the string passed in the “name” section of the namedtuples in Blueprint to match the name of the Blueprint module attribute name. This allows blueprints to be pickled and unpickled, without errors, which is a requirement of running Sanic in multiprocessing mode in Windows. Added a test for pickling and unpickling blueprints Added a test for pickling and unpickling sanic itself Added a test for enabling multiprocessing on an app with a blueprint (only useful to catch this bug if the tests are run on Windows).

    • Fix document for logging

Version 0.8


  • Changes:

    • Ownership changed to org ‘sanic-org’


  • Changes:

    • Add Server-Sent Events extension (Innokenty Lebedev)

    • Graceful handling of request_handler_task cancellation (Ashley Sommer)

    • Sanitize URL before redirection (aveao)

    • Add url_bytes to request (johndoe46)

    • py37 support for travisci (yunstanford)

    • Auto reloader support for OSX (garyo)

    • Add UUID route support (Volodymyr Maksymiv)

    • Add pausable response streams (Ashley Sommer)

    • Add weakref to request slots (vopankov)

    • remove ubuntu 12.04 from test fixture due to deprecation (yunstanford)

    • Allow streaming handlers in add_route (kinware)

    • use travis_retry for tox (Raphael Deem)

    • update aiohttp version for test client (yunstanford)

    • add redirect import for clarity (yingshaoxo)

    • Update HTTP Entity headers (Arnulfo Solís)

    • Add register_listener method (Stephan Fitzpatrick)

    • Remove uvloop/ujson dependencies for Windows (abuckenheimer)

    • Content-length header on 204/304 responses (Arnulfo Solís)

    • Extend WebSocketProtocol arguments and add docs (Bob Olde Hampsink, yunstanford)

    • Update development status from pre-alpha to beta (Maksim Anisenkov)

    • KeepAlive Timeout log level changed to debug (Arnulfo Solís)

    • Pin pytest to 3.3.2 because of pytest-dev/pytest#3170 (Maksim Aniskenov)

    • Install Python 3.5 and 3.6 on docker container for tests (Shahin Azad)

    • Add support for blueprint groups and nesting (Elias Tarhini)

    • Remove uvloop for windows setup (Aleksandr Kurlov)

    • Auto Reload (Yaser Amari)

    • Documentation updates/fixups (multiple contributors)

  • Fixes:

    • Fix: auto_reload in Linux (Ashley Sommer)

    • Fix: broken tests for aiohttp >= 3.3.0 (Ashley Sommer)

    • Fix: disable auto_reload by default on windows (abuckenheimer)

    • Fix (1143): Turn off access log with gunicorn (hqy)

    • Fix (1268): Support status code for file response (Cosmo Borsky)

    • Fix (1266): Add content_type flag to Sanic.static (Cosmo Borsky)

    • Fix: subprotocols parameter missing from add_websocket_route (ciscorn)

    • Fix (1242): Responses for CI header (yunstanford)

    • Fix (1237): add version constraint for websockets (yunstanford)

    • Fix (1231): memory leak - always release resource (Phillip Xu)

    • Fix (1221): make request truthy if transport exists (Raphael Deem)

    • Fix failing tests for aiohttp>=3.1.0 (Ashley Sommer)

    • Fix try_everything examples (PyManiacGR, kot83)

    • Fix (1158): default to auto_reload in debug mode (Raphael Deem)

    • Fix (1136): ErrorHandler.response handler call too restrictive (Julien Castiaux)

    • Fix: raw requires bytes-like object (cloudship)

    • Fix (1120): passing a list in to a route decorator’s host arg (Timothy Ebiuwhe)

    • Fix: Bug in multipart/form-data parser (DirkGuijt)

    • Fix: Exception for missing parameter when value is null (NyanKiyoshi)

    • Fix: Parameter check (Howie Hu)

    • Fix (1089): Routing issue with named parameters and different methods (yunstanford)

    • Fix (1085): Signal handling in multi-worker mode (yunstanford)

    • Fix: single quote in readme.rst (Cosven)

    • Fix: method typos (Dmitry Dygalo)

    • Fix: log_response correct output for ip and port (Wibowo Arindrarto)

    • Fix (1042): Exception Handling (Raphael Deem)

    • Fix: Chinese URIs (Howie Hu)

    • Fix (1079): timeout bug when self.transport is None (Raphael Deem)

    • Fix (1074): fix strict_slashes when route has slash (Raphael Deem)

    • Fix (1050): add samesite cookie to cookie keys (Raphael Deem)

    • Fix (1065): allow add_task after server starts (Raphael Deem)

    • Fix (1061): double quotes in unauthorized exception (Raphael Deem)

    • Fix (1062): inject the app in add_task method (Raphael Deem)

    • Fix: update environment.yml for readthedocs (Eli Uriegas)

    • Fix: Cancel request task when response timeout is triggered (Jeong YunWon)

    • Fix (1052): Method not allowed response for RFC7231 compliance (Raphael Deem)

    • Fix: IPv6 Address and Socket Data Format (Dan Palmer)

Note: Changelog was unmaintained between 0.1 and 0.7

Version 0.1


  • Reversed static url and directory arguments to meet spec


  • Static files

  • Lazy Cookie Loading


  • Cookies

  • Blueprint listeners and ordering

  • Faster Router

  • Fix: Incomplete file reads on medium+ sized post requests

  • Breaking: after_start and before_stop now pass sanic as their first argument


  • Multiprocessing


  • Blueprint support

  • Faster Response processing

0.1.1 - 0.1.2

  • Struggling to update pypi via CI


  • Released to public