Browse Source

Merge pull request #2373 from davidism/reload_templates_run_debug

Reconfigure app when debug is set by run command
pull/2381/head
David Lord 8 years ago committed by GitHub
parent
commit
1e112cccaa
  1. 3
      CHANGES
  2. 57
      flask/app.py
  3. 8
      flask/cli.py
  4. 15
      tests/test_templating.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
-------------- --------------

57
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,19 +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)
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

15
tests/test_templating.py

@ -14,6 +14,7 @@ import pytest
import flask import flask
import logging import logging
from jinja2 import TemplateNotFound from jinja2 import TemplateNotFound
import werkzeug.serving
def test_context_processing(app, client): def test_context_processing(app, client):
@ -385,6 +386,20 @@ def test_templates_auto_reload(app):
app.config['TEMPLATES_AUTO_RELOAD'] = True app.config['TEMPLATES_AUTO_RELOAD'] = True
assert app.jinja_env.auto_reload is True assert app.jinja_env.auto_reload is True
def test_templates_auto_reload_debug_run(app, monkeypatch):
def run_simple_mock(*args, **kwargs):
pass
monkeypatch.setattr(werkzeug.serving, 'run_simple', run_simple_mock)
app.run()
assert app.templates_auto_reload == False
assert app.jinja_env.auto_reload == False
app.run(debug=True)
assert app.templates_auto_reload == True
assert app.jinja_env.auto_reload == True
def test_template_loader_debugging(test_apps): def test_template_loader_debugging(test_apps):
from blueprintapp import app from blueprintapp import app

Loading…
Cancel
Save