What changed in Flask from 2 to 3
8 releases numbered after 2.3.3 up to and including 3.1.3, stable releases only. 2.3.3 and 3.1.3 are the newest stable releases of 2 and 3 we track; this page follows them as new ones ship.
- 5 mention breaking changes
- 2 remove or deprecate something
24 changes across 8 releases
- Provide a configuration option to control automatic option responses
- Flask.open_resource, open_instance_resource, and Blueprint.open_resource take an encoding parameter to use when opening in text mode, defaulting to utf-8
- Request.max_content_length can be customized per-request instead of only through the MAX_CONTENT_LENGTH config
- Add MAX_FORM_MEMORY_SIZE and MAX_FORM_PARTS config options
- Add support for the Partitioned cookie attribute (CHIPS) with the SESSION_COOKIE_PARTITIONED config
- Support key rotation with the SECRET_KEY_FALLBACKS config, a list of old secret keys that can still be used for unsigning
- Request.trusted_hosts is checked during routing and can be set through the TRUSTED_HOSTS config
- Relax type hint for passing bytes IO to send_file
- flask --help loads the app and plugins first to make sure all commands are shown
- Mark sans-io base class as being able to handle views that return AsyncIterable
- Update minimum dependency versions to Werkzeug >= 3.1, ItsDangerous >= 2.2, Blinker >= 1.9
- -e path takes precedence over default .env and .flaskenv files, and load_dotenv loads default files in addition to a path unless load_defaults=False is passed
- Initialize the cli attribute in the Flask concrete class instead of in the sansio scaffold
- stream_with_context does not fail inside async views
- When using follow_redirects in the test client, the final state of session is correct
- Fix signing key selection order when key rotation is enabled via SECRET_KEY_FALLBACKS
- Fix type hint for cli_runner.invoke
- Fix how setting host_matching=True or subdomain_matching=False interacts with SERVER_NAME so that setting SERVER_NAME no longer restricts requests to only that domain
- Avoid accessing the default hashlib.sha1 at import time to allow developers to change the default in FIPS builds where it may not be available
- Fix an issue where using other JSON providers, such as flask-orjson, previously caused loaded session data to have an incorrect format in some cases
- Add new deprecations
- The session is marked as accessed for operations that only access the keys but not the values, such as `in` and `len`
One release in the range carries no categorized changes yet: 3.0.2. Their original notes, where the vendor published any, are below.
Original release notes, newest first
The list above is our reading of these notes; the originals from Pallets are here, one fold per release.
3.1.3
This is the Flask 3.1.3 security fix release, which fixes a security issue but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
PyPI: https://pypi.org/project/Flask/3.1.3/ Changes: https://flask.palletsprojects.com/page/changes/#version-3-1-3
- The session is marked as accessed for operations that only access the keys but not the values, such as
inandlen. GHSA-68rp-wp8r-4726
3.1.2
This is the Flask 3.1.2 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
PyPI: https://pypi.org/project/Flask/3.1.2/ Changes: https://flask.palletsprojects.com/page/changes/#version-3-1-2 Milestone: https://github.com/pallets/flask/milestone/38?closed=1
stream_with_contextdoes not fail inside async views. #5774- When using
follow_redirectsin the test client, the final state ofsessionis correct. #5786 - Relax type hint for passing bytes IO to
send_file. #5776
3.1.1
This is the Flask 3.1.1 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
PyPI: https://pypi.org/project/Flask/3.1.1/ Changes: https://flask.palletsprojects.com/en/stable/changes/#version-3-1-1 Milestone https://github.com/pallets/flask/milestone/36?closed=1
- Fix signing key selection order when key rotation is enabled via
SECRET_KEY_FALLBACKS. GHSA-4grg-w6v8-c28g - Fix type hint for
cli_runner.invoke. #5645 flask --helploads the app and plugins first to make sure all commands are shown. #5673- Mark sans-io base class as being able to handle views that return
AsyncIterable. This is not accurate for Flask, but makes typing easier for Quart. #5659
3.1.0
This is the Flask 3.1.0 feature release. A feature release may include new features, remove previously deprecated code, add new deprecations, or introduce potentially breaking changes. We encourage everyone to upgrade, and to use a tool such as pip-tools to pin all dependencies and control upgrades. Test with warnings treated as errors to be able to adapt to deprecation warnings early.
PyPI: https://pypi.org/project/Flask/3.1.0/ Changes: https://flask.palletsprojects.com/en/stable/changes/#version-3-1-0 Milestone: https://github.com/pallets/flask/milestone/33?closed=1
- Drop support for Python 3.8. #5623
- Update minimum dependency versions to latest feature releases. Werkzeug >= 3.1, ItsDangerous >= 2.2, Blinker >= 1.9. #5624, #5633
- Provide a configuration option to control automatic option responses. #5496
Flask.open_resource/open_instance_resourceandBlueprint.open_resourcetake anencodingparameter to use when opening in text mode. It defaults toutf-8. #5504Request.max_content_lengthcan be customized per-request instead of only through theMAX_CONTENT_LENGTHconfig. AddedMAX_FORM_MEMORY_SIZEandMAX_FORM_PARTSconfig. Added documentation about resource limits to the security page. #5625- Add support for the
Partitionedcookie attribute (CHIPS), with theSESSION_COOKIE_PARTITIONEDconfig. #5472 -e pathtakes precedence over default.envand.flaskenvfiles.load_dotenvloads default files in addition to a path unlessload_defaults=Falseis passed. #5628- Support key rotation with the
SECRET_KEY_FALLBACKSconfig, a list of old secret keys that can still be used for unsigning. Extensions will need to add support. #5621 - Fix how setting
host_matching=Trueorsubdomain_matching=Falseinteracts withSERVER_NAME. SettingSERVER_NAMEno longer restricts requests to only that domain. #5553 Request.trusted_hostsis checked during routing, and can be set through theTRUSTED_HOSTSconfig. #5636
3.0.3
This is a fix release for the 3.0.x feature branch.
PyPI: https://pypi.org/project/Flask/3.0.3/ Changes: https://flask.palletsprojects.com/en/3.0.x/changes/#version-3-0-3 Milestone: https://github.com/pallets/flask/milestone/35?closed=1
- The default
hashlib.sha1may not be available in FIPS builds. Don't access it at import time so the developer has time to change the default. #5448 - Don't initialize the
cliattribute in the sansio scaffold, but rather in theFlaskconcrete class. #5270
3.0.2
This is a fix release for the 3.0.x feature release branch. It fixes bugs but does not otherwise change behavior and should not result in breaking changes.
3.0.1
This is a fix release for the 3.0.x feature release branch.
Fixes an issue where using other JSON providers, such as flask-orjson, previously caused loaded session data to have an incorrect format in some cases.
3.0.0
This is a feature release, which includes new features, removes previously deprecated code, and adds new deprecations. The 3.0.x branch is now the supported fix branch, the 2.3.x branch will become a tag marking the end of support for that branch. We encourage everyone to upgrade, and to use a tool such as pip-tools to pin all dependencies and control upgrades. Test with warnings treated as errors to be able to adapt to deprecation warnings early.