mirror of
https://github.com/pallets-eco/flask-debugtoolbar.git
synced 2026-01-07 05:59:37 -06:00
The init_app() restructuring in 356e6c removed "load_panels()", but need to add it back so panels like SQLAlchemy can register their URLs on the Blueprint before it's activated.
77 lines
2.1 KiB
Python
77 lines
2.1 KiB
Python
try:
|
|
from urllib.parse import unquote
|
|
except ImportError:
|
|
from urllib import unquote
|
|
|
|
from flask import url_for, current_app
|
|
from werkzeug.utils import import_string
|
|
|
|
|
|
class DebugToolbar(object):
|
|
|
|
_cached_panel_classes = {}
|
|
|
|
def __init__(self, request, jinja_env):
|
|
self.jinja_env = jinja_env
|
|
self.request = request
|
|
self.panels = []
|
|
|
|
self.template_context = {
|
|
'static_path': url_for('_debug_toolbar.static', filename='')
|
|
}
|
|
|
|
self.create_panels()
|
|
|
|
def create_panels(self):
|
|
"""
|
|
Populate debug panels
|
|
"""
|
|
activated = self.request.cookies.get('fldt_active', '')
|
|
activated = unquote(activated).split(';')
|
|
|
|
for panel_class in self._iter_panels(current_app):
|
|
panel_instance = panel_class(jinja_env=self.jinja_env, context=self.template_context)
|
|
|
|
if panel_instance.dom_id() in activated:
|
|
panel_instance.is_active = True
|
|
|
|
self.panels.append(panel_instance)
|
|
|
|
def render_toolbar(self):
|
|
context = self.template_context.copy()
|
|
context.update({'panels': self.panels})
|
|
|
|
template = self.jinja_env.get_template('base.html')
|
|
return template.render(**context)
|
|
|
|
@classmethod
|
|
def load_panels(cls, app):
|
|
for panel_class in cls._iter_panels(app):
|
|
# just loop to make sure they've been loaded
|
|
pass
|
|
|
|
@classmethod
|
|
def _iter_panels(cls, app):
|
|
for panel_path in app.config['DEBUG_TB_PANELS']:
|
|
panel_class = cls._import_panel(app, panel_path)
|
|
if panel_class is not None:
|
|
yield panel_class
|
|
|
|
@classmethod
|
|
def _import_panel(cls, app, path):
|
|
cache = cls._cached_panel_classes
|
|
|
|
try:
|
|
return cache[path]
|
|
except KeyError:
|
|
pass
|
|
|
|
try:
|
|
panel_class = import_string(path)
|
|
except ImportError as e:
|
|
app.logger.warning('Disabled %s due to ImportError: %s', path, e)
|
|
panel_class = None
|
|
|
|
cache[path] = panel_class
|
|
return panel_class
|