diff options
| author | Chris McDonough <chrism@plope.com> | 2011-08-13 01:00:39 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-08-13 01:00:39 -0400 |
| commit | 391402e63c1257ede0069f220ed5a1cca1b94a9b (patch) | |
| tree | 014d867eff43e5f18b1723ce7d846c87c1c2e202 /docs | |
| parent | dd25a5afd44d3fdc89782d232dfe818245e496cd (diff) | |
| download | pyramid-391402e63c1257ede0069f220ed5a1cca1b94a9b.tar.gz pyramid-391402e63c1257ede0069f220ed5a1cca1b94a9b.tar.bz2 pyramid-391402e63c1257ede0069f220ed5a1cca1b94a9b.zip | |
- Projects created via a scaffold no longer depend on the ``WebError``
package at all; configuration in the ``production.ini`` file which used to
require its ``error_catcher`` middleware has been removed. Configuring
error catching / email sending is now the domain of the ``pyramid_exclog``
package (see https://docs.pylonsproject.org/projects/pyramid_exclog/dev/).
Diffstat (limited to 'docs')
29 files changed, 50 insertions, 222 deletions
diff --git a/docs/glossary.rst b/docs/glossary.rst index 75bbd2827..6e4ca4b70 100644 --- a/docs/glossary.rst +++ b/docs/glossary.rst @@ -845,11 +845,6 @@ Glossary `WebTest <http://pythonpaste.org/webtest/>`_ is a package which can help you write functional tests for your WSGI application. - WebError - WSGI middleware which can display debuggable traceback information in - the browser when an exception is raised by a Pyramid application. See - http://pypi.python.org/pypi/WebError . - view mapper A view mapper is a class which implements the :class:`pyramid.interfaces.IViewMapperFactory` interface, which performs @@ -930,3 +925,16 @@ Glossary registry` as well as the Pyramid rendering machinery. See :ref:`registering_tweens`. + pyramid_debugtoolbar + A Pyramid add on which displays a helpful debug toolbar "on top of" HTML + pages rendered by your application, displaying request, routing, and + database information. ``pyramid_debugtoolbar`` is configured into the + ``development.ini`` of all applications which use a Pyramid + :term:`scaffold`. For more information, see + https://docs.pylonsproject.org/projects/pyramid_debugtoolbar/dev/ . + + scaffold + A project template that helps users get started writing a Pyramid + application quickly. Scaffolds are usually used via the ``paster + create`` command. + diff --git a/docs/narr/MyProject/production.ini b/docs/narr/MyProject/production.ini index 7a5674d23..0a2154b15 100644 --- a/docs/narr/MyProject/production.ini +++ b/docs/narr/MyProject/production.ini @@ -8,23 +8,8 @@ pyramid.debug_routematch = false pyramid.debug_templates = false pyramid.default_locale_name = en -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror MyProject [server:main] diff --git a/docs/narr/commandline.rst b/docs/narr/commandline.rst index 0f23c153c..b1a646aec 100644 --- a/docs/narr/commandline.rst +++ b/docs/narr/commandline.rst @@ -466,9 +466,14 @@ example above looks like so: .. code-block:: ini [pipeline:main] - pipeline = egg:WebError#evalerror + pipeline = translogger another + [filter:translogger] + filter_app_factory = egg:Paste#translogger + setup_console_handler = False + logger_name = wsgi + [app:another] use = egg:MyProject @@ -477,7 +482,8 @@ configuration implied by the ``[pipeline:main]`` section of your configuration file by default. Specifying ``/path/to/my/development.ini`` is logically equivalent to specifying ``/path/to/my/development.ini#main``. In this case, we'll be using a configuration that includes an ``app`` object -which is wrapped in the WebError ``evalerror`` middleware. +which is wrapped in the Paste "translogger" middleware (which logs requests +to the console). You can also specify a particular *section* of the PasteDeploy ``.ini`` file to load instead of ``main``: diff --git a/docs/narr/project.rst b/docs/narr/project.rst index e59d04ee1..aed93f9c5 100644 --- a/docs/narr/project.rst +++ b/docs/narr/project.rst @@ -588,13 +588,11 @@ implementations. The ``production.ini`` file is a :term:`PasteDeploy` configuration file with a purpose much like that of ``development.ini``. However, it disables the -debug toolbar, replacing it with a logger which outputs exception messages to -``stderr`` by default. It also turns off template development options such -that templates are not automatically reloaded when changed, and turns off all -debugging options. It allows you to configure a ``weberror#error_catcher`` -section that will cause exceptions to be sent to an email address when they -are uncaught. You can use this file instead of ``development.ini`` when you -put your application into production. +debug toolbar, and filters all log messages except those above the WARN +level. It also turns off template development options such that templates +are not automatically reloaded when changed, and turns off all debugging +options. This file is appropriate to use instead of ``development.ini`` when +you put your application into production. .. index:: single: MANIFEST.in diff --git a/docs/tutorials/wiki/basiclayout.rst b/docs/tutorials/wiki/basiclayout.rst index 66cf37e4e..1aebaffd7 100644 --- a/docs/tutorials/wiki/basiclayout.rst +++ b/docs/tutorials/wiki/basiclayout.rst @@ -179,24 +179,9 @@ configurations don't use a pipeline: instead they expose a single WSGI application as "main". Our setup is more complicated, so we use a pipeline composed of :term:`middleware`. -The ``egg:WebError#evalerror`` middleware is at the "top" of the pipeline. -This is middleware which displays debuggable errors in the browser while -you're developing (not recommended for a production system). - -The ``egg:repoze.zodbconn#closer`` middleware is in the middle of the -pipeline. This is a piece of middleware which closes the ZODB connection -opened by the ``PersistentApplicationFinder`` at the end of the request. - -The ``egg:repoze.retry#retry`` middleware catches ``ConflictError`` -exceptions from ZODB and retries the request up to three times (ZODB is an -optimistic concurrency database that relies on application-level transaction -retries when a conflict occurs). - -The ``tm`` middleware is the last piece of middleware in the pipeline. This -commits a transaction near the end of the request unless there's an exception -raised or the HTTP response code is an error code. The ``tm`` refers to the -``[filter:tm]`` section beneath the pipeline declaration, which configures -the transaction manager. +The ``egg:repoze.zodbconn#closer`` middleware is at the top of the pipeline. +This is a piece of middleware which closes the ZODB connection opened by the +``PersistentApplicationFinder`` at the end of the request. The final line in the ``[pipeline:main]`` section is ``tutorial``, which refers to the ``[app:tutorial]`` section above it. The ``[app:tutorial]`` diff --git a/docs/tutorials/wiki/definingviews.rst b/docs/tutorials/wiki/definingviews.rst index b111c9b4a..3970d482c 100644 --- a/docs/tutorials/wiki/definingviews.rst +++ b/docs/tutorials/wiki/definingviews.rst @@ -319,4 +319,4 @@ browser. The views we'll try are as follows: - To generate an error, visit ``http://localhost:6543/add_page`` which will generate an ``IndexError`` for the expression ``request.subpath[0]``. You'll see an interactive traceback - facility provided by :term:`WebError`. + facility provided by :term:`pyramid_debugtoolbar`. diff --git a/docs/tutorials/wiki/installation.rst b/docs/tutorials/wiki/installation.rst index 30fb67441..cc2cf0ae2 100644 --- a/docs/tutorials/wiki/installation.rst +++ b/docs/tutorials/wiki/installation.rst @@ -65,12 +65,12 @@ Preparation, UNIX $ bin/easy_install pyramid -#. Use ``easy_install`` to install ``docutils``, ``repoze.tm2``, +#. Use ``easy_install`` to install ``docutils``, ``pyramid_tm``, ``repoze.zodbconn``, ``nose`` and ``coverage``: .. code-block:: text - $ bin/easy_install docutils repoze.tm2 repoze.zodbconn \ + $ bin/easy_install docutils pyramid_tm repoze.zodbconn \ nose coverage Preparation, Windows @@ -117,12 +117,12 @@ Preparation, Windows c:\pyramidtut> Scripts\easy_install pyramid -#. Use ``easy_install`` to install ``docutils``, ``repoze.tm2``, +#. Use ``easy_install`` to install ``docutils``, ``pyramid_tm``, ``repoze.zodbconn``, ``nose`` and ``coverage``: .. code-block:: text - c:\pyramidtut> Scripts\easy_install docutils repoze.tm2 ^ + c:\pyramidtut> Scripts\easy_install docutils pyramid_tm \ repoze.zodbconn nose coverage .. _making_a_project: diff --git a/docs/tutorials/wiki/src/authorization/production.ini b/docs/tutorials/wiki/src/authorization/production.ini index bd8199fb2..247d789a9 100644 --- a/docs/tutorials/wiki/src/authorization/production.ini +++ b/docs/tutorials/wiki/src/authorization/production.ini @@ -11,23 +11,8 @@ tm.attempts = 3 zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000 -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror egg:repoze.zodbconn#closer tutorial diff --git a/docs/tutorials/wiki/src/authorization/setup.py b/docs/tutorials/wiki/src/authorization/setup.py index f3b404516..9cf0fb143 100644 --- a/docs/tutorials/wiki/src/authorization/setup.py +++ b/docs/tutorials/wiki/src/authorization/setup.py @@ -12,7 +12,6 @@ requires = [ 'pyramid_tm', 'pyramid_debugtoolbar', 'ZODB3', - 'WebError', 'docutils', ] diff --git a/docs/tutorials/wiki/src/basiclayout/production.ini b/docs/tutorials/wiki/src/basiclayout/production.ini index bd8199fb2..247d789a9 100644 --- a/docs/tutorials/wiki/src/basiclayout/production.ini +++ b/docs/tutorials/wiki/src/basiclayout/production.ini @@ -11,23 +11,8 @@ tm.attempts = 3 zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000 -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror egg:repoze.zodbconn#closer tutorial diff --git a/docs/tutorials/wiki/src/basiclayout/setup.py b/docs/tutorials/wiki/src/basiclayout/setup.py index 31833dc7f..bc689f941 100644 --- a/docs/tutorials/wiki/src/basiclayout/setup.py +++ b/docs/tutorials/wiki/src/basiclayout/setup.py @@ -12,7 +12,6 @@ requires = [ 'pyramid_tm', 'pyramid_debugtoolbar', 'ZODB3', - 'WebError', ] setup(name='tutorial', diff --git a/docs/tutorials/wiki/src/models/production.ini b/docs/tutorials/wiki/src/models/production.ini index bd8199fb2..247d789a9 100644 --- a/docs/tutorials/wiki/src/models/production.ini +++ b/docs/tutorials/wiki/src/models/production.ini @@ -11,23 +11,8 @@ tm.attempts = 3 zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000 -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror egg:repoze.zodbconn#closer tutorial diff --git a/docs/tutorials/wiki/src/models/setup.py b/docs/tutorials/wiki/src/models/setup.py index 31833dc7f..bc689f941 100644 --- a/docs/tutorials/wiki/src/models/setup.py +++ b/docs/tutorials/wiki/src/models/setup.py @@ -12,7 +12,6 @@ requires = [ 'pyramid_tm', 'pyramid_debugtoolbar', 'ZODB3', - 'WebError', ] setup(name='tutorial', diff --git a/docs/tutorials/wiki/src/tests/production.ini b/docs/tutorials/wiki/src/tests/production.ini index bd8199fb2..247d789a9 100644 --- a/docs/tutorials/wiki/src/tests/production.ini +++ b/docs/tutorials/wiki/src/tests/production.ini @@ -11,23 +11,8 @@ tm.attempts = 3 zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000 -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror egg:repoze.zodbconn#closer tutorial diff --git a/docs/tutorials/wiki/src/tests/setup.py b/docs/tutorials/wiki/src/tests/setup.py index 603bb6bac..b0fd80edd 100644 --- a/docs/tutorials/wiki/src/tests/setup.py +++ b/docs/tutorials/wiki/src/tests/setup.py @@ -12,7 +12,6 @@ requires = [ 'pyramid_tm', 'pyramid_debugtoolbar', 'ZODB3', - 'WebError', 'docutils', 'WebTest', # add this ] diff --git a/docs/tutorials/wiki/src/views/production.ini b/docs/tutorials/wiki/src/views/production.ini index bd8199fb2..247d789a9 100644 --- a/docs/tutorials/wiki/src/views/production.ini +++ b/docs/tutorials/wiki/src/views/production.ini @@ -11,23 +11,8 @@ tm.attempts = 3 zodb_uri = file://%(here)s/Data.fs?connection_cache_size=20000 -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror egg:repoze.zodbconn#closer tutorial diff --git a/docs/tutorials/wiki/src/views/setup.py b/docs/tutorials/wiki/src/views/setup.py index 6acc004c0..315a11fe8 100644 --- a/docs/tutorials/wiki/src/views/setup.py +++ b/docs/tutorials/wiki/src/views/setup.py @@ -12,7 +12,6 @@ requires = [ 'pyramid_tm', 'pyramid_debugtoolbar', 'ZODB3', - 'WebError', 'docutils', ] diff --git a/docs/tutorials/wiki2/installation.rst b/docs/tutorials/wiki2/installation.rst index bd597b5df..2ea20dcb0 100644 --- a/docs/tutorials/wiki2/installation.rst +++ b/docs/tutorials/wiki2/installation.rst @@ -45,7 +45,7 @@ Preparation, UNIX .. code-block:: text $ bin/easy_install docutils nose coverage zope.sqlalchemy \ - SQLAlchemy repoze.tm2 + SQLAlchemy pyramid_tm Preparation, Windows -------------------- @@ -73,8 +73,8 @@ Preparation, Windows .. code-block:: text - c:\pyramidtut> Scripts\easy_install docutils ^ - nose coverage zope.sqlalchemy SQLAlchemy repoze.tm2 + c:\pyramidtut> Scripts\easy_install docutils \ + nose coverage zope.sqlalchemy SQLAlchemy pyramid_tm .. _sql_making_a_project: diff --git a/docs/tutorials/wiki2/src/authorization/production.ini b/docs/tutorials/wiki2/src/authorization/production.ini index f7b742cb9..45ef791b7 100644 --- a/docs/tutorials/wiki2/src/authorization/production.ini +++ b/docs/tutorials/wiki2/src/authorization/production.ini @@ -7,25 +7,11 @@ pyramid.debug_routematch = false pyramid.debug_templates = false pyramid.default_locale_name = en pyramid.includes = pyramid_tm -sqlalchemy.url = sqlite:///%(here)s/tutorial.db -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = +sqlalchemy.url = sqlite:///%(here)s/tutorial.db [pipeline:main] pipeline = - weberror tutorial [server:main] diff --git a/docs/tutorials/wiki2/src/authorization/setup.py b/docs/tutorials/wiki2/src/authorization/setup.py index ae9869d50..785d61326 100644 --- a/docs/tutorials/wiki2/src/authorization/setup.py +++ b/docs/tutorials/wiki2/src/authorization/setup.py @@ -11,9 +11,9 @@ requires = [ 'pyramid', 'SQLAlchemy', 'transaction', - 'repoze.tm2>=1.0b1', # default_commit_veto + 'pyramid_tm', + 'pyramid_debugtoolbar', 'zope.sqlalchemy', - 'WebError', 'docutils', ] diff --git a/docs/tutorials/wiki2/src/basiclayout/production.ini b/docs/tutorials/wiki2/src/basiclayout/production.ini index c80a0a216..45ef791b7 100644 --- a/docs/tutorials/wiki2/src/basiclayout/production.ini +++ b/docs/tutorials/wiki2/src/basiclayout/production.ini @@ -10,23 +10,8 @@ pyramid.includes = pyramid_tm sqlalchemy.url = sqlite:///%(here)s/tutorial.db -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror tutorial [server:main] diff --git a/docs/tutorials/wiki2/src/basiclayout/setup.py b/docs/tutorials/wiki2/src/basiclayout/setup.py index eaf1ddcfe..99b7cabda 100644 --- a/docs/tutorials/wiki2/src/basiclayout/setup.py +++ b/docs/tutorials/wiki2/src/basiclayout/setup.py @@ -11,9 +11,9 @@ requires = [ 'pyramid', 'SQLAlchemy', 'transaction', - 'repoze.tm2>=1.0b1', # default_commit_veto + 'pyramid_tm', + 'pyramid_debugtoolbar', 'zope.sqlalchemy', - 'WebError', ] if sys.version_info[:3] < (2,5,0): diff --git a/docs/tutorials/wiki2/src/models/production.ini b/docs/tutorials/wiki2/src/models/production.ini index c80a0a216..45ef791b7 100644 --- a/docs/tutorials/wiki2/src/models/production.ini +++ b/docs/tutorials/wiki2/src/models/production.ini @@ -10,23 +10,8 @@ pyramid.includes = pyramid_tm sqlalchemy.url = sqlite:///%(here)s/tutorial.db -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror tutorial [server:main] diff --git a/docs/tutorials/wiki2/src/models/setup.py b/docs/tutorials/wiki2/src/models/setup.py index eaf1ddcfe..99b7cabda 100644 --- a/docs/tutorials/wiki2/src/models/setup.py +++ b/docs/tutorials/wiki2/src/models/setup.py @@ -11,9 +11,9 @@ requires = [ 'pyramid', 'SQLAlchemy', 'transaction', - 'repoze.tm2>=1.0b1', # default_commit_veto + 'pyramid_tm', + 'pyramid_debugtoolbar', 'zope.sqlalchemy', - 'WebError', ] if sys.version_info[:3] < (2,5,0): diff --git a/docs/tutorials/wiki2/src/tests/production.ini b/docs/tutorials/wiki2/src/tests/production.ini index c80a0a216..45ef791b7 100644 --- a/docs/tutorials/wiki2/src/tests/production.ini +++ b/docs/tutorials/wiki2/src/tests/production.ini @@ -10,23 +10,8 @@ pyramid.includes = pyramid_tm sqlalchemy.url = sqlite:///%(here)s/tutorial.db -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror tutorial [server:main] diff --git a/docs/tutorials/wiki2/src/tests/setup.py b/docs/tutorials/wiki2/src/tests/setup.py index 7828f185d..ef7f1c215 100644 --- a/docs/tutorials/wiki2/src/tests/setup.py +++ b/docs/tutorials/wiki2/src/tests/setup.py @@ -11,9 +11,9 @@ requires = [ 'pyramid', 'SQLAlchemy', 'transaction', - 'repoze.tm2>=1.0b1', + 'pyramid_tm', + 'pyramid_debugtoolbar', 'zope.sqlalchemy', - 'WebError', 'docutils', 'WebTest', # add this ] diff --git a/docs/tutorials/wiki2/src/views/production.ini b/docs/tutorials/wiki2/src/views/production.ini index c80a0a216..45ef791b7 100644 --- a/docs/tutorials/wiki2/src/views/production.ini +++ b/docs/tutorials/wiki2/src/views/production.ini @@ -10,23 +10,8 @@ pyramid.includes = pyramid_tm sqlalchemy.url = sqlite:///%(here)s/tutorial.db -[filter:weberror] -use = egg:WebError#error_catcher -debug = false -;error_log = -;show_exceptions_in_wsgi_errors = true -;smtp_server = localhost -;error_email = janitor@example.com -;smtp_username = janitor -;smtp_password = "janitor's password" -;from_address = paste@localhost -;error_subject_prefix = "Pyramid Error" -;smtp_use_tls = -;error_message = - [pipeline:main] pipeline = - weberror tutorial [server:main] diff --git a/docs/tutorials/wiki2/src/views/setup.py b/docs/tutorials/wiki2/src/views/setup.py index ae9869d50..785d61326 100644 --- a/docs/tutorials/wiki2/src/views/setup.py +++ b/docs/tutorials/wiki2/src/views/setup.py @@ -11,9 +11,9 @@ requires = [ 'pyramid', 'SQLAlchemy', 'transaction', - 'repoze.tm2>=1.0b1', # default_commit_veto + 'pyramid_tm', + 'pyramid_debugtoolbar', 'zope.sqlalchemy', - 'WebError', 'docutils', ] diff --git a/docs/whatsnew-1.0.rst b/docs/whatsnew-1.0.rst index 5cd822b0d..61d74a899 100644 --- a/docs/whatsnew-1.0.rst +++ b/docs/whatsnew-1.0.rst @@ -99,8 +99,8 @@ Scaffold Improvements - The scaffolds now have much nicer CSS and graphics. -- The ``development.ini``, generated by all scaffolds, is now configured - to use the :term:`WebError` interactive exception debugger by default. +- The ``development.ini``, generated by all scaffolds, is now configured to + use the WebError interactive exception debugger by default. - All scaffolds have been normalized: each now uses the name ``main`` to represent the function that returns a WSGI application, and each now has |
