forked from orbit-oss/flask
update changelog
move test next to existing test, rename reword / reflow param doc
This commit is contained in:
parent
8ad4f476aa
commit
97e2cd0a5a
3 changed files with 58 additions and 51 deletions
7
CHANGES
7
CHANGES
|
|
@ -21,7 +21,11 @@ Major release, unreleased
|
||||||
- ``send_file`` supports Unicode in ``attachment_filename``. (`#2223`_)
|
- ``send_file`` supports Unicode in ``attachment_filename``. (`#2223`_)
|
||||||
- Pass ``_scheme`` argument from ``url_for`` to ``handle_build_error``.
|
- Pass ``_scheme`` argument from ``url_for`` to ``handle_build_error``.
|
||||||
(`#2017`_)
|
(`#2017`_)
|
||||||
|
- Add support for ``provide_automatic_options`` in ``add_url_rule`` to disable
|
||||||
|
adding OPTIONS method when the ``view_func`` argument is not a class.
|
||||||
|
(`#1489`_).
|
||||||
|
|
||||||
|
.. _#1489: https://github.com/pallets/flask/pull/1489
|
||||||
.. _#2017: https://github.com/pallets/flask/pull/2017
|
.. _#2017: https://github.com/pallets/flask/pull/2017
|
||||||
.. _#2223: https://github.com/pallets/flask/pull/2223
|
.. _#2223: https://github.com/pallets/flask/pull/2223
|
||||||
|
|
||||||
|
|
@ -146,9 +150,6 @@ Released on May 29th 2016, codename Absinthe.
|
||||||
- ``flask.g`` now has ``pop()`` and ``setdefault`` methods.
|
- ``flask.g`` now has ``pop()`` and ``setdefault`` methods.
|
||||||
- Turn on autoescape for ``flask.templating.render_template_string`` by default
|
- Turn on autoescape for ``flask.templating.render_template_string`` by default
|
||||||
(pull request ``#1515``).
|
(pull request ``#1515``).
|
||||||
- Added support for `provide_automatic_options` in :meth:`add_url_rule` to
|
|
||||||
turn off automatic OPTIONS when the `view_func` argument is not a class
|
|
||||||
(pull request ``#1489``).
|
|
||||||
- ``flask.ext`` is now deprecated (pull request ``#1484``).
|
- ``flask.ext`` is now deprecated (pull request ``#1484``).
|
||||||
- ``send_from_directory`` now raises BadRequest if the filename is invalid on
|
- ``send_from_directory`` now raises BadRequest if the filename is invalid on
|
||||||
the server OS (pull request ``#1763``).
|
the server OS (pull request ``#1763``).
|
||||||
|
|
|
||||||
11
flask/app.py
11
flask/app.py
|
|
@ -980,8 +980,7 @@ class Flask(_PackageBoundObject):
|
||||||
return iter(self._blueprint_order)
|
return iter(self._blueprint_order)
|
||||||
|
|
||||||
@setupmethod
|
@setupmethod
|
||||||
def add_url_rule(self, rule, endpoint=None, view_func=None,
|
def add_url_rule(self, rule, endpoint=None, view_func=None, provide_automatic_options=None, **options):
|
||||||
provide_automatic_options=None, **options):
|
|
||||||
"""Connects a URL rule. Works exactly like the :meth:`route`
|
"""Connects a URL rule. Works exactly like the :meth:`route`
|
||||||
decorator. If a view_func is provided it will be registered with the
|
decorator. If a view_func is provided it will be registered with the
|
||||||
endpoint.
|
endpoint.
|
||||||
|
|
@ -1021,10 +1020,10 @@ class Flask(_PackageBoundObject):
|
||||||
endpoint
|
endpoint
|
||||||
:param view_func: the function to call when serving a request to the
|
:param view_func: the function to call when serving a request to the
|
||||||
provided endpoint
|
provided endpoint
|
||||||
:param provide_automatic_options: controls whether ``OPTIONS`` should
|
:param provide_automatic_options: controls whether the ``OPTIONS``
|
||||||
be provided automatically. If this
|
method should be added automatically. This can also be controlled
|
||||||
is not set, will check attributes on
|
by setting the ``view_func.provide_automatic_options = False``
|
||||||
the view or list of methods.
|
before adding the rule.
|
||||||
:param options: the options to be forwarded to the underlying
|
:param options: the options to be forwarded to the underlying
|
||||||
:class:`~werkzeug.routing.Rule` object. A change
|
:class:`~werkzeug.routing.Rule` object. A change
|
||||||
to Werkzeug is handling of method options. methods
|
to Werkzeug is handling of method options. methods
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ def test_options_on_multiple_rules():
|
||||||
assert sorted(rv.allow) == ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
|
assert sorted(rv.allow) == ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
|
||||||
|
|
||||||
|
|
||||||
def test_options_handling_disabled():
|
def test_provide_automatic_options_attr():
|
||||||
app = flask.Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
def index():
|
def index():
|
||||||
|
|
@ -70,6 +70,54 @@ def test_options_handling_disabled():
|
||||||
assert sorted(rv.allow) == ['OPTIONS']
|
assert sorted(rv.allow) == ['OPTIONS']
|
||||||
|
|
||||||
|
|
||||||
|
def test_provide_automatic_options_kwarg():
|
||||||
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
|
def index():
|
||||||
|
return flask.request.method
|
||||||
|
|
||||||
|
def more():
|
||||||
|
return flask.request.method
|
||||||
|
|
||||||
|
app.add_url_rule('/', view_func=index, provide_automatic_options=False)
|
||||||
|
app.add_url_rule(
|
||||||
|
'/more', view_func=more, methods=['GET', 'POST'],
|
||||||
|
provide_automatic_options=False
|
||||||
|
)
|
||||||
|
|
||||||
|
c = app.test_client()
|
||||||
|
assert c.get('/').data == b'GET'
|
||||||
|
|
||||||
|
rv = c.post('/')
|
||||||
|
assert rv.status_code == 405
|
||||||
|
assert sorted(rv.allow) == ['GET', 'HEAD']
|
||||||
|
|
||||||
|
# Older versions of Werkzeug.test.Client don't have an options method
|
||||||
|
if hasattr(c, 'options'):
|
||||||
|
rv = c.options('/')
|
||||||
|
else:
|
||||||
|
rv = c.open('/', method='OPTIONS')
|
||||||
|
|
||||||
|
assert rv.status_code == 405
|
||||||
|
|
||||||
|
rv = c.head('/')
|
||||||
|
assert rv.status_code == 200
|
||||||
|
assert not rv.data # head truncates
|
||||||
|
assert c.post('/more').data == b'POST'
|
||||||
|
assert c.get('/more').data == b'GET'
|
||||||
|
|
||||||
|
rv = c.delete('/more')
|
||||||
|
assert rv.status_code == 405
|
||||||
|
assert sorted(rv.allow) == ['GET', 'HEAD', 'POST']
|
||||||
|
|
||||||
|
if hasattr(c, 'options'):
|
||||||
|
rv = c.options('/more')
|
||||||
|
else:
|
||||||
|
rv = c.open('/more', method='OPTIONS')
|
||||||
|
|
||||||
|
assert rv.status_code == 405
|
||||||
|
|
||||||
|
|
||||||
def test_request_dispatching():
|
def test_request_dispatching():
|
||||||
app = flask.Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
|
|
@ -1751,44 +1799,3 @@ def test_run_from_config(monkeypatch, host, port, expect_host, expect_port):
|
||||||
app = flask.Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
app.config['SERVER_NAME'] = 'pocoo.org:8080'
|
app.config['SERVER_NAME'] = 'pocoo.org:8080'
|
||||||
app.run(host, port)
|
app.run(host, port)
|
||||||
|
|
||||||
|
|
||||||
def test_disable_automatic_options():
|
|
||||||
# Issue 1488: Add support for a kwarg to add_url_rule to disable the auto OPTIONS response
|
|
||||||
app = flask.Flask(__name__)
|
|
||||||
|
|
||||||
def index():
|
|
||||||
return flask.request.method
|
|
||||||
|
|
||||||
def more():
|
|
||||||
return flask.request.method
|
|
||||||
|
|
||||||
app.add_url_rule('/', 'index', index, provide_automatic_options=False)
|
|
||||||
app.add_url_rule('/more', 'more', more, methods=['GET', 'POST'], provide_automatic_options=False)
|
|
||||||
|
|
||||||
c = app.test_client()
|
|
||||||
assert c.get('/').data == b'GET'
|
|
||||||
rv = c.post('/')
|
|
||||||
assert rv.status_code == 405
|
|
||||||
assert sorted(rv.allow) == ['GET', 'HEAD']
|
|
||||||
# Older versions of Werkzeug.test.Client don't have an options method
|
|
||||||
if hasattr(c, 'options'):
|
|
||||||
rv = c.options('/')
|
|
||||||
else:
|
|
||||||
rv = c.open('/', method='OPTIONS')
|
|
||||||
assert rv.status_code == 405
|
|
||||||
|
|
||||||
rv = c.head('/')
|
|
||||||
assert rv.status_code == 200
|
|
||||||
assert not rv.data # head truncates
|
|
||||||
assert c.post('/more').data == b'POST'
|
|
||||||
assert c.get('/more').data == b'GET'
|
|
||||||
rv = c.delete('/more')
|
|
||||||
assert rv.status_code == 405
|
|
||||||
assert sorted(rv.allow) == ['GET', 'HEAD', 'POST']
|
|
||||||
# Older versions of Werkzeug.test.Client don't have an options method
|
|
||||||
if hasattr(c, 'options'):
|
|
||||||
rv = c.options('/more')
|
|
||||||
else:
|
|
||||||
rv = c.open('/more', method='OPTIONS')
|
|
||||||
assert rv.status_code == 405
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue