更新日志
Version 1.1.1¶
Released 2019-07-08
The
flask.json_available
flag was added back for compatibility with some extensions. It will raise a deprecation warning when used, and will be removed in version 2.0.0. #3288
Version 1.1.0¶
Released 2019-07-04
Bump minimum Werkzeug version to >= 0.15.
Drop support for Python 3.4.
Error handlers for
InternalServerError
or500
will always be passed an instance ofInternalServerError
. If they are invoked due to an unhandled exception, that original exception is now available ase.original_exception
rather than being passed directly to the handler. The same is true if the handler is for the baseHTTPException
. This makes error handler behavior more consistent. #3266Flask.finalize_request()
is called for all unhandled exceptions even if there is no500
error handler.
Flask.logger
takes the same name asFlask.name
(the value passed asFlask(import_name)
. This reverts 1.0’s behavior of always logging to"flask.app"
, in order to support multiple apps in the same process. A warning will be shown if old configuration is detected that needs to be moved. #2866flask.RequestContext.copy()
includes the current session object in the request context copy. This preventssession
pointing to an out-of-date object. #2935Using built-in RequestContext, unprintable Unicode characters in Host header will result in a HTTP 400 response and not HTTP 500 as previously. #2994
send_file()
supportsPathLike
objects as described in PEP 0519, to supportpathlib
in Python 3. #3059send_file()
supportsBytesIO
partial content. #2957open_resource()
accepts the “rt” file mode. This still does the same thing as “r”. #3163The
MethodView.methods
attribute set in a base class is used by subclasses. #3138Flask.jinja_options
is adict
instead of anImmutableDict
to allow easier configuration. Changes must still be made before creating the environment. #3190Flask’s
JSONMixin
for the request and response wrappers was moved into Werkzeug. Use Werkzeug’s version with Flask-specific support. This bumps the Werkzeug dependency to >= 0.15. #3125The
flask
command entry point is simplified to take advantage of Werkzeug 0.15’s better reloader support. This bumps the Werkzeug dependency to >= 0.15. #3022Support
static_url_path
that ends with a forward slash. #3134Support empty
static_folder
without requiring setting an emptystatic_url_path
as well. #3124jsonify()
supportsdataclasses.dataclass
objects. #3195Allow customizing the
Flask.url_map_class
used for routing. #3069The development server port can be set to 0, which tells the OS to pick an available port. #2926
The return value from
cli.load_dotenv()
is more consistent with the documentation. It will returnFalse
if python-dotenv is not installed, or if the given path isn’t a file. #2937Signaling support has a stub for the
connect_via
method when the Blinker library is not installed. #3208Add an
--extra-files
option to theflask run
CLI command to specify extra files that will trigger the reloader on change. #2897Allow returning a dictionary from a view function. Similar to how returning a string will produce a
text/html
response, returning a dict will calljsonify
to produce aapplication/json
response. #3111Blueprints have a
cli
Click group likeapp.cli
. CLI commands registered with a blueprint will be available as a group under theflask
command. #1357.When using the test client as a context manager (
with client:
), all preserved request contexts are popped when the block exits, ensuring nested contexts are cleaned up correctly. #3157Show a better error message when the view return type is not supported. #3214
flask.testing.make_test_environ_builder()
has been deprecated in favour of a new classflask.testing.EnvironBuilder
. #3232The
flask run
command no longer fails if Python is not built with SSL support. Using the--cert
option will show an appropriate error message. #3211URL matching now occurs after the request context is pushed, rather than when it’s created. This allows custom URL converters to access the app and request contexts, such as to query a database for an id. #3088
Version 1.0.4¶
Released 2019-07-04
The key information for
BadRequestKeyError
is no longer cleared outside debug mode, so error handlers can still access it. This requires upgrading to Werkzeug 0.15.5. #3249send_file
url quotes the “:” and “/” characters for more compatible UTF-8 filename support in some browsers. #3074Fixes for PEP451 import loaders and pytest 5.x. #3275
Show message about dotenv on stderr instead of stdout. #3285
Version 1.0.3¶
Released 2019-05-17
send_file()
encodes filenames as ASCII instead of Latin-1 (ISO-8859-1). This fixes compatibility with Gunicorn, which is stricter about header encodings than PEP 3333. #2766Allow custom CLIs using
FlaskGroup
to set the debug flag without it always being overwritten based on environment variables. #2765flask --version
outputs Werkzeug’s version and simplifies the Python version. #2825send_file()
handles anattachment_filename
that is a native Python 2 string (bytes) with UTF-8 coded bytes. #2933A catch-all error handler registered for
HTTPException
will not handleRoutingException
, which is used internally during routing. This fixes the unexpected behavior that had been introduced in 1.0. #2986Passing the
json
argument toapp.test_client
does not push/pop an extra app context. #2900
Version 1.0.2¶
Released 2018-05-02
Version 1.0.1¶
Released 2018-04-29
Fix registering partials (with no
__name__
) as view functions. #2730Don’t treat lists returned from view functions the same as tuples. Only tuples are interpreted as response data. #2736
Extra slashes between a blueprint’s
url_prefix
and a route URL are merged. This fixes some backwards compatibility issues with the change in 1.0. #2731, #2742Only trap
BadRequestKeyError
errors in debug mode, not allBadRequest
errors. This allowsabort(400)
to continue working as expected. #2735The
FLASK_SKIP_DOTENV
environment variable can be set to1
to skip automatically loading dotenv files. #2722
Version 1.0¶
Released 2018-04-26
Python 2.6 and 3.3 are no longer supported.
Bump minimum dependency versions to the latest stable versions: Werkzeug >= 0.14, Jinja >= 2.10, itsdangerous >= 0.24, Click >= 5.1. #2586
Skip
app.run
when a Flask application is run from the command line. This avoids some behavior that was confusing to debug.Change the default for
JSONIFY_PRETTYPRINT_REGULAR
toFalse
.jsonify()
returns a compact format by default, and an indented format in debug mode. #2193Flask.__init__
accepts thehost_matching
argument and sets it onurl_map
. #1559Flask.__init__
accepts thestatic_host
argument and passes it as thehost
argument when defining the static route. #1559send_file()
supports Unicode inattachment_filename
. #2223Pass
_scheme
argument fromurl_for()
tohandle_url_build_error()
. #2017add_url_rule()
accepts theprovide_automatic_options
argument to disable adding theOPTIONS
method. #1489MethodView
subclasses inherit method handlers from base classes. #1936Errors caused while opening the session at the beginning of the request are handled by the app’s error handlers. #2254
Blueprints gained
json_encoder
andjson_decoder
attributes to override the app’s encoder and decoder. #1898Flask.make_response()
raisesTypeError
instead ofValueError
for bad response types. The error messages have been improved to describe why the type is invalid. #2256Add
routes
CLI command to output routes registered on the application. #2259Show warning when session cookie domain is a bare hostname or an IP address, as these may not behave properly in some browsers, such as Chrome. #2282
Allow IP address as exact session cookie domain. #2282
SESSION_COOKIE_DOMAIN
is set if it is detected throughSERVER_NAME
. #2282Auto-detect zero-argument app factory called
create_app
ormake_app
fromFLASK_APP
. #2297Factory functions are not required to take a
script_info
parameter to work with theflask
command. If they take a single parameter or a parameter namedscript_info
, theScriptInfo
object will be passed. #2319FLASK_APP
can be set to an app factory, with arguments if needed, for exampleFLASK_APP=myproject.app:create_app('dev')
. #2326FLASK_APP
can point to local packages that are not installed in editable mode, althoughpip install -e
is still preferred. #2414The
View
class attributeprovide_automatic_options
is set inas_view()
, to be detected byadd_url_rule()
. #2316Error handling will try handlers registered for
blueprint, code
,app, code
,blueprint, exception
,app, exception
. #2314Cookie
is added to the response’sVary
header if the session is accessed at all during the request (and not deleted). #2288test_request_context()
acceptssubdomain
andurl_scheme
arguments for use when building the base URL. #1621Set
APPLICATION_ROOT
to'/'
by default. This was already the implicit default when it was set toNone
.TRAP_BAD_REQUEST_ERRORS
is enabled by default in debug mode.BadRequestKeyError
has a message with the bad key in debug mode instead of the generic bad request message. #2348Allow registering new tags with
TaggedJSONSerializer
to support storing other types in the session cookie. #2352Only open the session if the request has not been pushed onto the context stack yet. This allows
stream_with_context()
generators to access the same session that the containing view uses. #2354Add
json
keyword argument for the test client request methods. This will dump the given object as JSON and set the appropriate content type. #2358Extract JSON handling to a mixin applied to both the
Request
andResponse
classes. This adds theis_json()
andget_json()
methods to the response to make testing JSON response much easier. #2358Removed error handler caching because it caused unexpected results for some exception inheritance hierarchies. Register handlers explicitly for each exception if you want to avoid traversing the MRO. #2362
Fix incorrect JSON encoding of aware, non-UTC datetimes. #2374
Template auto reloading will honor debug mode even even if
jinja_env
was already accessed. #2373The following old deprecated code was removed. #2385
flask.ext
- import extensions directly by their name instead of through theflask.ext
namespace. For example,import flask.ext.sqlalchemy
becomesimport flask_sqlalchemy
.Flask.init_jinja_globals
- extendFlask.create_jinja_environment()
instead.Flask.error_handlers
- tracked byFlask.error_handler_spec
, useFlask.errorhandler()
to register handlers.Flask.request_globals_class
- useFlask.app_ctx_globals_class
instead.Flask.static_path
- useFlask.static_url_path
instead.Request.module
- useRequest.blueprint
instead.
The
Request.json
property is no longer deprecated. #1421Support passing a
EnvironBuilder
ordict
totest_client.open
. #2412The
flask
command andFlask.run()
will load environment variables from.env
and.flaskenv
files if python-dotenv is installed. #2416When passing a full URL to the test client, the scheme in the URL is used instead of
PREFERRED_URL_SCHEME
. #2430Flask.logger
has been simplified.LOGGER_NAME
andLOGGER_HANDLER_POLICY
config was removed. The logger is always namedflask.app
. The level is only set on first access, it doesn’t checkFlask.debug
each time. Only one format is used, not different ones depending onFlask.debug
. No handlers are removed, and a handler is only added if no handlers are already configured. #2436Blueprint view function names may not contain dots. #2450
Fix a
ValueError
caused by invalidRange
requests in some cases. #2526The development server uses threads by default. #2529
Loading config files with
silent=True
will ignoreENOTDIR
errors. #2581Pass
--cert
and--key
options toflask run
to run the development server over HTTPS. #2606Added
SESSION_COOKIE_SAMESITE
to control theSameSite
attribute on the session cookie. #2607Added
test_cli_runner()
to create a Click runner that can invoke Flask CLI commands for testing. #2636Subdomain matching is disabled by default and setting
SERVER_NAME
does not implicitly enable it. It can be enabled by passingsubdomain_matching=True
to theFlask
constructor. #2635A single trailing slash is stripped from the blueprint
url_prefix
when it is registered with the app. #2629Request.get_json()
doesn’t cache the result if parsing fails whensilent
is true. #2651Request.get_json()
no longer accepts arbitrary encodings. Incoming JSON should be encoded using UTF-8 per RFC 8259, but Flask will autodetect UTF-8, -16, or -32. #2691Added
MAX_COOKIE_SIZE
andResponse.max_cookie_size
to control when Werkzeug warns about large cookies that browsers may ignore. #2693Updated documentation theme to make docs look better in small windows. #2709
Rewrote the tutorial docs and example project to take a more structured approach to help new users avoid common pitfalls. #2676
Version 0.12.3¶
Released 2018-04-26
Request.get_json()
no longer accepts arbitrary encodings. Incoming JSON should be encoded using UTF-8 per RFC 8259, but Flask will autodetect UTF-8, -16, or -32. #2692Fix a Python warning about imports when using
python -m flask
. #2666Fix a
ValueError
caused by invalidRange
requests in some cases.
Version 0.12.1¶
Released 2017-03-31
Prevent
flask run
from showing aNoAppException
when anImportError
occurs within the imported application module.Fix encoding behavior of
app.config.from_pyfile
for Python 3. #2118Use the
SERVER_NAME
config if it is present as default values forapp.run
. #2109, #2152Call
ctx.auto_pop
with the exception object instead ofNone
, in the event that aBaseException
such asKeyboardInterrupt
is raised in a request handler.
Version 0.12¶
Released 2016-12-21, codename Punsch
The cli command now responds to
--version
.Mimetype guessing and ETag generation for file-like objects in
send_file
has been removed. #104, :pr`1849`Mimetype guessing in
send_file
now fails loudly and doesn’t fall back toapplication/octet-stream
. #1988Make
flask.safe_join
able to join multiple paths likeos.path.join
#1730Revert a behavior change that made the dev server crash instead of returning an Internal Server Error. #2006
Correctly invoke response handlers for both regular request dispatching as well as error handlers.
Disable logger propagation by default for the app logger.
Add support for range requests in
send_file
.app.test_client
includes preset default environment, which can now be directly set, instead of perclient.get
.Fix crash when running under PyPy3. #1814
Version 0.11.1¶
Released 2016-06-07
Fixed a bug that prevented
FLASK_APP=foobar/__init__.py
from working. #1872
Version 0.11¶
Released 2016-05-29, codename Absinthe
Added support to serializing top-level arrays to
flask.jsonify()
. This introduces a security risk in ancient browsers. See JSON 安全 for details.Added before_render_template signal.
Added
**kwargs
toflask.Test.test_client()
to support passing additional keyword arguments to the constructor offlask.Flask.test_client_class
.Added
SESSION_REFRESH_EACH_REQUEST
config key that controls the set-cookie behavior. If set toTrue
a permanent session will be refreshed each request and get their lifetime extended, if set toFalse
it will only be modified if the session actually modifies. Non permanent sessions are not affected by this and will always expire if the browser window closes.Made Flask support custom JSON mimetypes for incoming data.
Added support for returning tuples in the form
(response, headers)
from a view function.Added
flask.Config.from_json()
.Added
flask.Flask.config_class
.Added
flask.Config.get_namespace()
.Templates are no longer automatically reloaded outside of debug mode. This can be configured with the new
TEMPLATES_AUTO_RELOAD
config key.Added a workaround for a limitation in Python 3.3’s namespace loader.
Added support for explicit root paths when using Python 3.3’s namespace packages.
Added flask and the
flask.cli
module to start the local debug server through the click CLI system. This is recommended over the oldflask.run()
method as it works faster and more reliable due to a different design and also replacesFlask-Script
.Error handlers that match specific classes are now checked first, thereby allowing catching exceptions that are subclasses of HTTP exceptions (in
werkzeug.exceptions
). This makes it possible for an extension author to create exceptions that will by default result in the HTTP error of their choosing, but may be caught with a custom error handler if desired.Added
flask.Config.from_mapping()
.Flask will now log by default even if debug is disabled. The log format is now hardcoded but the default log handling can be disabled through the
LOGGER_HANDLER_POLICY
configuration key.Removed deprecated module functionality.
Added the
EXPLAIN_TEMPLATE_LOADING
config flag which when enabled will instruct Flask to explain how it locates templates. This should help users debug when the wrong templates are loaded.Enforce blueprint handling in the order they were registered for template loading.
Ported test suite to py.test.
Deprecated
request.json
in favour ofrequest.get_json()
.Add “pretty” and “compressed” separators definitions in jsonify() method. Reduces JSON response size when
JSONIFY_PRETTYPRINT_REGULAR=False
by removing unnecessary white space included by default after separators.JSON responses are now terminated with a newline character, because it is a convention that UNIX text files end with a newline and some clients don’t deal well when this newline is missing. This came up originally as a part of https://github.com/postmanlabs/httpbin/issues/168. #1262
The automatically provided
OPTIONS
method is now correctly disabled if the user registered an overriding rule with the lowercase-versionoptions
. #1288flask.json.jsonify
now supports thedatetime.date
type. #1326Don’t leak exception info of already caught exceptions to context teardown handlers. #1393
Allow custom Jinja environment subclasses. #1422
Updated extension dev guidelines.
flask.g
now haspop()
andsetdefault
methods.Turn on autoescape for
flask.templating.render_template_string
by default. #1515flask.ext
is now deprecated. #1484send_from_directory
now raises BadRequest if the filename is invalid on the server OS. #1763Added the
JSONIFY_MIMETYPE
configuration variable. #1728Exceptions during teardown handling will no longer leave bad application contexts lingering around.
Fixed broken
test_appcontext_signals()
test case.Raise an
AttributeError
inflask.helpers.find_package()
with a useful message explaining why it is raised when a PEP 302 import hook is used without anis_package()
method.Fixed an issue causing exceptions raised before entering a request or app context to be passed to teardown handlers.
Fixed an issue with query parameters getting removed from requests in the test client when absolute URLs were requested.
Made
@before_first_request
into a decorator as intended.Fixed an etags bug when sending a file streams with a name.
Fixed
send_from_directory
not expanding to the application root path correctly.Changed logic of before first request handlers to flip the flag after invoking. This will allow some uses that are potentially dangerous but should probably be permitted.
Fixed Python 3 bug when a handler from
app.url_build_error_handlers
reraises theBuildError
.
Version 0.10.1¶
Released 2013-06-14
Fixed an issue where
|tojson
was not quoting single quotes which made the filter not work properly in HTML attributes. Now it’s possible to use that filter in single quoted attributes. This should make using that filter with angular.js easier.Added support for byte strings back to the session system. This broke compatibility with the common case of people putting binary data for token verification into the session.
Fixed an issue where registering the same method twice for the same endpoint would trigger an exception incorrectly.
Version 0.10¶
Released 2013-06-13, codename Limoncello
Changed default cookie serialization format from pickle to JSON to limit the impact an attacker can do if the secret key leaks. See Version 0.10 for more information.
Added
template_test
methods in addition to the already existingtemplate_filter
method family.Added
template_global
methods in addition to the already existingtemplate_filter
method family.Set the content-length header for x-sendfile.
tojson
filter now does not escape script blocks in HTML5 parsers.tojson
used in templates is now safe by default due. This was allowed due to the different escaping behavior.Flask will now raise an error if you attempt to register a new function on an already used endpoint.
Added wrapper module around simplejs