Commit graph

72 commits

Author SHA1 Message Date
David Lord
39f9363296
finish moving url_for to app
move entire implementation to app
make special build args actual keyword-only args
handle no app context in method
mention other config in server_name error
implicit external with scheme
use adapter.build url_scheme argument
rewrite documentation
2022-05-14 12:46:01 -07:00
Ivan Sushkov
92acd05d9b
add url_for method to app 2022-05-14 12:45:18 -07:00
David Lord
fac630379d
update app.redirect docs 2022-05-12 16:33:40 -07:00
dzcode
eb5dd9f5ef
add aborter object to app 2022-05-12 13:29:54 -07:00
Tim Hoagland
fdab801fbb
add redirect method to app 2022-05-10 11:02:24 -07:00
Stanislav Bushuev
a74e266474
skip coverage for TYPE_CHECKING 2022-05-03 12:11:55 -06:00
David Lord
c9a1f7ad65
don't intercept 307/308 routing redirects
These don't change the request body, so the debug error is no longer relevant.
2022-03-23 08:25:22 -07:00
David Lord
190dd4df86
don't use AnyStr for ResponseValue type 2022-03-15 08:32:15 -07:00
David Lord
8886328822
relax errorhandler function arg type 2022-03-15 08:32:15 -07:00
Colin Adams
6f79cb8a23
Fix typing on app.session_interface 2022-02-16 21:12:01 -08:00
David Lord
1b552d0b01
remove ContextVar compat 2021-11-11 16:12:08 -08:00
David Lord
3f6cdbd8b3
use similar code for all callback-applying methods
avoid building nested chain iterables
avoid triggering defaultdict when looking up registries
apply functions as they are looked up
2021-10-03 20:36:21 -07:00
Matthias Paulsen
166a2a6207
Fix callback order for nested blueprints
Handlers registered via url_value_preprocessor, before_request,
context_processor, and url_defaults are called in downward order: First
on the app and last on the current blueprint.

Handlers registered via after_request and teardown_request are called
in upward order: First on the current blueprint and last on the app.
2021-10-03 20:27:24 -07:00
Pedro Torcatt
22933a8cb4
fix docs for Flask.test_client_class 2021-10-01 10:01:54 -07:00
David Lord
6a4bf9eec1
use exception chaining
fixes flake8-bugbear B904
2021-10-01 09:39:10 -07:00
Yourun-Proger
9a2adfba4d
static_folder can be a pathlib.Path 2021-08-05 18:16:20 -07:00
Adrian Moennich
6e1b72096d Fix typo in docs 2021-07-06 22:05:31 +02:00
Pascal Corpet
6a4e7e948d improve typing for app.errorhandler decorator 2021-06-01 19:25:27 +01:00
laggardkernel
491ea32803 Optimize loop in Flask._find_error_handler() 2021-06-01 15:50:20 +00:00
Marat Sharafutdinov
a960236117 Fix type annotation for before_request and before_app_request decorators 2021-05-25 18:29:52 +00:00
David Lord
63b306743f changelog for blueprint registered name 2021-05-21 15:04:30 +01:00
David Lord
67b0b7e30d cache blueprint path calculation 2021-05-21 15:04:18 +01:00
pgjones
141fde1d8e Bugfix blueprint naming
Following discussions for Flask we've decided to name blueprints based
on how they are registered. This allows for two different blueprints
to have the same self-name as long as they are registered in different
nested positions. This helps users choose better blueprint names.
2021-05-21 15:04:18 +01:00
Alex Hedges
10a36cb60e Improve decorator factory type signatures
These changes are required to preserve the type signatures of the
created decorators.
2021-05-21 08:09:05 +00:00
David Lord
25884c433f
fix typing that wasn't available in Python 3.6.0 2021-05-13 13:06:32 -07:00
David Lord
1403d35e2a
update type annotations 2021-05-11 14:41:52 -07:00
pgjones
2889da67cb
Remove the async helper method
It is better to encourage users to utilise the app ensure_sync method
(or the newely added async_to_sync method) so that any extensions that
alter these methods take affect throughout the users code.

With the helper method users code fix parts of their code to the
asgiref async_to_sync ignoring any extension changes.
2021-05-03 06:18:41 -07:00
pgjones
7f87f3dd93
Simplify the async handling code
Firstly `run_sync` was a misleading name as it didn't run anything,
instead I think `async_to_sync` is much clearer as it converts a
coroutine function to a function. (Name stolen from asgiref).

Secondly trying to run the ensure_sync during registration made the
code more complex and brittle, e.g. the _flask_async_wrapper
usage. This was done to pay any setup costs during registration rather
than runtime, however this only saved a iscoroutne check. It allows
the weirdness of the Blueprint and Scaffold ensure_sync methods to be
removed.

Switching to runtime ensure_sync usage provides a method for
extensions to also support async, as now documented.
2021-05-03 06:15:39 -07:00
pgjones
77237093da Add initial type hints
This should make it easier for users to correctly use Flask. The hints
are from Quart.
2021-04-26 17:29:53 +01:00
pgjones
5c6a0f0c12 Fix wrapped view function comparison
Wrapped functions are not comparable, see
https://bugs.python.org/issue3564, therefore a marker is used to note
when the function has been sync wrapped to allow comparison with the
wrapped function instead.

This ensures that multiple route decorators work without raising
exceptions i.e.,

    @app.route("/")
    @app.route("/a")
    async def index():
        ...

works.
2021-04-16 12:34:51 +01:00
pgjones
f92e820b4b
Nested blueprints
This allows blueprints to be nested within blueprints via a new
Blueprint.register_blueprint method. This should provide a use case
that has been desired for the past ~10 years.

This works by setting the endpoint name to be the blueprint names,
from parent to child delimeted by "." and then iterating over the
blueprint names in reverse order in the app (from most specific to
most general). This means that the expectation of nesting a blueprint
within a nested blueprint is met.
2021-04-14 09:25:42 -07:00
pgjones
6d5ccdefe2 Bugfix iscoroutinefunction with Python3.7
See this Python bug https://bugs.python.org/issue33261. The
iscoroutinefunction doesn't recognise partially wrapped coroutine
functions as coroutine functions - which is problematic as the
coroutines will be called as if they are sync, which results in
un-awaited coroutines.
2021-04-12 19:38:42 +01:00
David Lord
dc3e9c0cc3
update async docs 2021-04-06 15:33:06 -07:00
pgjones
00f5a3e55c
Alter ensure_sync implementation to support extensions
This allows extensions to override the Flask.ensure_sync method and
have the change apply to blueprints as well. Without this change it is
possible for differing blueprints to have differing ensure_sync
approaches depending on the extension used - which would likely result
in event-loop blocking issues.

This also allows blueprints to have a custom ensure_sync, although
this is a by product rather than an expected use case.
2021-04-06 15:33:06 -07:00
pgjones
6979265fa6
Add async support
This allows for async functions to be passed to the Flask class
instance, for example as a view function,

    @app.route("/")
    async def index():
        return "Async hello"

this comes with a cost though of poorer performance than using the
sync equivalent.

asgiref is the standard way to run async code within a sync context,
and is used in Django making it a safe and sane choice for this.
2021-04-06 09:35:10 -07:00
David Lord
25ab05e6a2
remove old note about InternalServerError 2021-03-10 10:38:16 -08:00
David Lord
7029674775
rewrite Scaffold docs 2021-03-10 10:38:16 -08:00
David Lord
9f7c602a84
move _PackageBoundObject into Scaffold 2021-03-10 10:38:13 -08:00
pgjones
83d358d2c4
remove _blueprint_order, dicts are ordered
This code originates from supporting Python 2.4. Dicts are ordered in
supported Pythons as of 3.6. An OrderedDict could be used to indicate
that order matters, but is not since we don't rely on the implementation
differences.
2021-03-08 09:58:12 -08:00
pgjones
fd62210f58
Utilise defaultdicts
This code originates from the Python 2.4 supporting version of Flask,
with defaultdicts being added in 2.5. Using defaultdict makes the
intentional usage clearer, and slightly simplifies the code.
2021-03-08 09:58:12 -08:00
David Lord
b473e7c97c
use Jinja's tojson filter 2021-02-01 22:48:09 -08:00
David Lord
81ba6c24ef
remove Jinja 'autoescape' and 'with' extensions 2021-02-01 19:14:58 -08:00
David Lord
64206c13c2
simplify InternalServerError.original_exception 2021-01-29 11:26:17 -08:00
David Lord
eb42655c46
simplify BadRequestKeyError.show_exception 2021-01-29 11:03:33 -08:00
David Lord
1936ca8a2e
remove BaseRequest and BaseResponse 2021-01-29 10:52:48 -08:00
David Lord
dc11cdb4a4
move send_file and send_from_directory to Werkzeug
The implementations were moved to Werkzeug, Flask's functions become
wrappers around Werkzeug to pass some Flask-specific values.

cache_timeout is renamed to max_age. SEND_FILE_MAX_AGE_DEFAULT,
app.send_file_max_age_default, and app.get_send_file_max_age defaults
to None. This tells the browser to use conditional requests rather than
a 12 hour cache.

attachment_filename is renamed to download_name, and is always sent if
a name is known.

Deprecate helpers.safe_join in favor of werkzeug.utils.safe_join.

Removed most of the send_file tests, they're tested in Werkzeug.

In the file upload example, renamed the uploaded_file view to
download_file to avoid a common source of confusion.
2020-11-05 09:27:52 -08:00
Bogdan Opanchuk
8efea0ccbb
Break reference cycle created by default in Flask instances.
Flask instances with static folders were creating a reference cycle
via their "static" view function (which held a strong reference back
to the Flask instance to call its `send_static_file` method). This
prevented CPython from freeing the memory for a Flask instance
when all external references to it were released.

Now use a weakref for the back reference to avoid this.

Co-authored-by: Joshua Bronson <jab@users.noreply.github.com>
2020-10-03 10:05:05 -04:00
yk396
b146a13f63
extract common Flask/Blueprint API to Scaffold base class
Co-authored-by: Chris Nguyen <chrisngyn99@gmail.com>
2020-08-01 07:45:58 -07:00
Christopher Nguyen
7b09a0904c
change make_response to use headers.update 2020-07-23 16:53:39 -07:00
jackwardell
846ee2c62e
add assert message for errorhandler exception type 2020-04-16 10:49:42 -07:00