Commit 3b5d1df5 authored by Laurent Peuch's avatar Laurent Peuch
Browse files

[pyramid/ctl] add a new option to activate the debugtoolbar (-t)

While this toolbar isn't yet very integrated with CW, it integrates an inline
debugging shell like werkzeug for flask or django_extensions which greatly
helps debugging on exception.

It can already be manually activated by writting "pyramid.includes =
pyramid_debugtoolbar" but it's hidden somewhere in the documentation and not
very accessible and annoying to do.

Closes #17219765
parent 74b473f288d5
...@@ -33,7 +33,7 @@ from pyramid.exceptions import ConfigurationError ...@@ -33,7 +33,7 @@ from pyramid.exceptions import ConfigurationError
from pyramid.settings import asbool, aslist from pyramid.settings import asbool, aslist
def config_from_cwconfig(cwconfig, settings=None): def config_from_cwconfig(cwconfig, settings=None, debugtoolbar=False):
"""Return a Pyramid Configurator instance built from a CubicWeb config and """Return a Pyramid Configurator instance built from a CubicWeb config and
Pyramid-specific configuration files (pyramid.ini). Pyramid-specific configuration files (pyramid.ini).
...@@ -41,14 +41,18 @@ def config_from_cwconfig(cwconfig, settings=None): ...@@ -41,14 +41,18 @@ def config_from_cwconfig(cwconfig, settings=None):
:returns: A Pyramid config object :returns: A Pyramid config object
""" """
settings = dict(settings) if settings else {} settings = dict(settings) if settings else {}
settings.update(settings_from_cwconfig(cwconfig)) settings.update(settings_from_cwconfig(cwconfig, debugtoolbar=debugtoolbar))
config = Configurator(settings=settings) config = Configurator(settings=settings)
config.registry['cubicweb.config'] = cwconfig config.registry['cubicweb.config'] = cwconfig
config.include('cubicweb.pyramid') config.include('cubicweb.pyramid')
if debugtoolbar:
config.include("pyramid_debugtoolbar")
return config return config
def settings_from_cwconfig(cwconfig): def settings_from_cwconfig(cwconfig, debugtoolbar=False):
''' '''
Extract settings from pyramid.ini and pyramid-debug.ini (if in debug) Extract settings from pyramid.ini and pyramid-debug.ini (if in debug)
...@@ -82,7 +86,7 @@ def settings_from_cwconfig(cwconfig): ...@@ -82,7 +86,7 @@ def settings_from_cwconfig(cwconfig):
def wsgi_application_from_cwconfig( def wsgi_application_from_cwconfig(
cwconfig, cwconfig,
profile=False, profile_output=None, profile_dump_every=None): profile=False, profile_output=None, profile_dump_every=None, debugtoolbar=False):
""" Build a WSGI application from a cubicweb configuration """ Build a WSGI application from a cubicweb configuration
:param cwconfig: A CubicWeb configuration :param cwconfig: A CubicWeb configuration
...@@ -90,10 +94,12 @@ def wsgi_application_from_cwconfig( ...@@ -90,10 +94,12 @@ def wsgi_application_from_cwconfig(
:param profile_output: Profiling output filename. See :ref:`profiling`. :param profile_output: Profiling output filename. See :ref:`profiling`.
:param profile_dump_every: Profiling number of requests before dumping the :param profile_dump_every: Profiling number of requests before dumping the
stats. See :ref:`profiling`. stats. See :ref:`profiling`.
:param debugtoolbar: Activate pyramid debugtoolbar when True.
:returns: A fully operationnal WSGI application :returns: A fully operationnal WSGI application
""" """
config = config_from_cwconfig(cwconfig) config = config_from_cwconfig(cwconfig, debugtoolbar=debugtoolbar)
profile = profile or asbool(config.registry.settings.get( profile = profile or asbool(config.registry.settings.get(
'cubicweb.profile.enable', False)) 'cubicweb.profile.enable', False))
if profile: if profile:
......
...@@ -99,6 +99,10 @@ class PyramidStartHandler(InstanceCommand): ...@@ -99,6 +99,10 @@ class PyramidStartHandler(InstanceCommand):
('debug', ('debug',
{'short': 'D', 'action': 'store_true', {'short': 'D', 'action': 'store_true',
'help': 'Equals to "--debug-mode --reload"'}), 'help': 'Equals to "--debug-mode --reload"'}),
('toolbar',
{'short': 't', 'action': 'store_true',
'help': 'Activate the pyramid debug toolbar'
'(the pypi "pyramid_debugtoolbar" package must be installed)'}),
('reload', ('reload',
{'action': 'store_true', {'action': 'store_true',
'help': 'Restart the server if any source file is changed'}), 'help': 'Restart the server if any source file is changed'}),
...@@ -255,10 +259,23 @@ class PyramidStartHandler(InstanceCommand): ...@@ -255,10 +259,23 @@ class PyramidStartHandler(InstanceCommand):
if self['loglevel'] is None and self['debug']: if self['loglevel'] is None and self['debug']:
init_cmdline_log_threshold(self.cwconfig, 'debug') init_cmdline_log_threshold(self.cwconfig, 'debug')
# if the debugtoolbar is activated, test if it's importable
if self['toolbar']:
try:
import pyramid_debugtoolbar # noqa
except ImportError:
print("Error: you've tried to activate the pyramid debugtoolbar but it failed to "
"import, make sure it's correctly installed by doing a "
"'pip install pyramid_debugtoolbar'.\nYou can find more information on the "
"official documentation: "
"https://docs.pylonsproject.org/projects/pyramid_debugtoolbar/en/latest/")
sys.exit(1)
app = wsgi_application_from_cwconfig( app = wsgi_application_from_cwconfig(
cwconfig, profile=self['profile'], cwconfig, profile=self['profile'],
profile_output=self['profile-output'], profile_output=self['profile-output'],
profile_dump_every=self['profile-dump-every'] profile_dump_every=self['profile-dump-every'],
debugtoolbar=self['toolbar']
) )
host = cwconfig['interface'] host = cwconfig['interface']
......
...@@ -47,6 +47,8 @@ New features ...@@ -47,6 +47,8 @@ New features
* on DBG_SQL and/or DBG_RQL, if pygments is installed, syntax highlight sql/rql * on DBG_SQL and/or DBG_RQL, if pygments is installed, syntax highlight sql/rql
debug output debug output
* add a new '-t/--toolbar' option the pyramid command to activate the pyramid debugtoolbar
Backwards incompatible changes Backwards incompatible changes
------------------------------ ------------------------------
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment