Browse Source

reconfigure the app from run command and method

extract templates_auto_reload to property
continues #1910
closes #1907
pull/2373/head
David Lord 7 years ago
parent
commit
4fc48200a5
No known key found for this signature in database
GPG Key ID: 7A1C87E3F5BC42A8
  1. 3
      CHANGES
  2. 59
      flask/app.py
  3. 8
      flask/cli.py

3
CHANGES

@ -79,6 +79,8 @@ Major release, unreleased
- Removed error handler caching because it caused unexpected results for some - Removed error handler caching because it caused unexpected results for some
exception inheritance hierarchies. Register handlers explicitly for each exception inheritance hierarchies. Register handlers explicitly for each
exception if you don't want to traverse the MRO. (`#2362`_) exception if you don't want to traverse the MRO. (`#2362`_)
- Template auto reloading will honor the ``run`` command's ``debug`` flag even
if ``app.jinja_env`` was already accessed. (`#2373`_)
.. _#1489: https://github.com/pallets/flask/pull/1489 .. _#1489: https://github.com/pallets/flask/pull/1489
.. _#1621: https://github.com/pallets/flask/pull/1621 .. _#1621: https://github.com/pallets/flask/pull/1621
@ -102,6 +104,7 @@ Major release, unreleased
.. _#2354: https://github.com/pallets/flask/pull/2354 .. _#2354: https://github.com/pallets/flask/pull/2354
.. _#2358: https://github.com/pallets/flask/pull/2358 .. _#2358: https://github.com/pallets/flask/pull/2358
.. _#2362: https://github.com/pallets/flask/pull/2362 .. _#2362: https://github.com/pallets/flask/pull/2362
.. _#2373: https://github.com/pallets/flask/pull/2373
Version 0.12.2 Version 0.12.2
-------------- --------------

59
flask/app.py

@ -703,6 +703,28 @@ class Flask(_PackageBoundObject):
""" """
return open(os.path.join(self.instance_path, resource), mode) return open(os.path.join(self.instance_path, resource), mode)
def _get_templates_auto_reload(self):
"""Reload templates when they are changed. Used by
:meth:`create_jinja_environment`.
This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If
not set, it will be enabled in debug mode.
.. versionadded:: 1.0
This property was added but the underlying config and behavior
already existed.
"""
rv = self.config['TEMPLATES_AUTO_RELOAD']
return rv if rv is not None else self.debug
def _set_templates_auto_reload(self, value):
self.config['TEMPLATES_AUTO_RELOAD'] = value
templates_auto_reload = property(
_get_templates_auto_reload, _set_templates_auto_reload
)
del _get_templates_auto_reload, _set_templates_auto_reload
def create_jinja_environment(self): def create_jinja_environment(self):
"""Creates the Jinja2 environment based on :attr:`jinja_options` """Creates the Jinja2 environment based on :attr:`jinja_options`
and :meth:`select_jinja_autoescape`. Since 0.7 this also adds and :meth:`select_jinja_autoescape`. Since 0.7 this also adds
@ -715,13 +737,13 @@ class Flask(_PackageBoundObject):
``TEMPLATES_AUTO_RELOAD`` configuration option. ``TEMPLATES_AUTO_RELOAD`` configuration option.
""" """
options = dict(self.jinja_options) options = dict(self.jinja_options)
if 'autoescape' not in options: if 'autoescape' not in options:
options['autoescape'] = self.select_jinja_autoescape options['autoescape'] = self.select_jinja_autoescape
if 'auto_reload' not in options: if 'auto_reload' not in options:
if self.config['TEMPLATES_AUTO_RELOAD'] is not None: options['auto_reload'] = self.templates_auto_reload
options['auto_reload'] = self.config['TEMPLATES_AUTO_RELOAD']
else:
options['auto_reload'] = self.debug
rv = self.jinja_environment(self, **options) rv = self.jinja_environment(self, **options)
rv.globals.update( rv.globals.update(
url_for=url_for, url_for=url_for,
@ -806,6 +828,22 @@ class Flask(_PackageBoundObject):
rv.update(processor()) rv.update(processor())
return rv return rv
def _reconfigure_for_run_debug(self, debug):
"""The ``run`` commands will set the application's debug flag. Some
application configuration may already be calculated based on the
previous debug value. This method will recalculate affected values.
Called by the :func:`flask.cli.run` command or :meth:`Flask.run`
method if the debug flag is set explicitly in the call.
:param debug: the new value of the debug flag
.. versionadded:: 1.0
Reconfigures ``app.jinja_env.auto_reload``.
"""
self.debug = debug
self.jinja_env.auto_reload = self.templates_auto_reload
def run(self, host=None, port=None, debug=None, **options): def run(self, host=None, port=None, debug=None, **options):
"""Runs the application on a local development server. """Runs the application on a local development server.
@ -859,21 +897,24 @@ class Flask(_PackageBoundObject):
explain_ignored_app_run() explain_ignored_app_run()
return return
from werkzeug.serving import run_simple if debug is not None:
self._reconfigure_for_run_debug(bool(debug))
_host = '127.0.0.1' _host = '127.0.0.1'
_port = 5000 _port = 5000
server_name = self.config.get("SERVER_NAME") server_name = self.config.get("SERVER_NAME")
sn_host, sn_port = None, None sn_host, sn_port = None, None
if server_name: if server_name:
sn_host, _, sn_port = server_name.partition(':') sn_host, _, sn_port = server_name.partition(':')
host = host or sn_host or _host host = host or sn_host or _host
port = int(port or sn_port or _port) port = int(port or sn_port or _port)
if debug is not None:
self.debug = bool(debug)
options.setdefault('use_reloader', self.debug) options.setdefault('use_reloader', self.debug)
options.setdefault('use_debugger', self.debug) options.setdefault('use_debugger', self.debug)
if debug:
self.jinja_env.auto_reload = True from werkzeug.serving import run_simple
try: try:
run_simple(host, port, self, **options) run_simple(host, port, self, **options)
finally: finally:

8
flask/cli.py

@ -319,8 +319,10 @@ class ScriptInfo(object):
be returned. be returned.
""" """
__traceback_hide__ = True __traceback_hide__ = True
if self._loaded_app is not None: if self._loaded_app is not None:
return self._loaded_app return self._loaded_app
if self.create_app is not None: if self.create_app is not None:
rv = call_factory(self.create_app, self) rv = call_factory(self.create_app, self)
else: else:
@ -330,10 +332,14 @@ class ScriptInfo(object):
'the FLASK_APP environment variable.\n\nFor more ' 'the FLASK_APP environment variable.\n\nFor more '
'information see ' 'information see '
'http://flask.pocoo.org/docs/latest/quickstart/') 'http://flask.pocoo.org/docs/latest/quickstart/')
rv = locate_app(self, self.app_import_path) rv = locate_app(self, self.app_import_path)
debug = get_debug_flag() debug = get_debug_flag()
if debug is not None: if debug is not None:
rv.debug = debug rv._reconfigure_for_run_debug(debug)
self._loaded_app = rv self._loaded_app = rv
return rv return rv

Loading…
Cancel
Save