• pecan is now officially supported for Python 3.6
  • pecan is no longer supported for Python 2.6





  • Pecan now officially supports Python 3.5.
  • Pecan now uses inspect.signature instead of inspect.getargspec in Python 3.5 and higher (because inspect.getargspec is deprecated in these versions of Python 3).
  • Fixed a bug that caused “after” hooks to run multiple times when pecan.redirect(…, internal=True) was used (https://github.com/pecan/pecan/issues/58).






  • Fixed an edge case in pecan.util.getargspec that caused the incorrect argspec to be returned in certain situations when using Python 2.6.
  • Added a threading.lock to the file system monitoring in pecan serve –reload to avoid extraneous server reloads.


  • Fixed a bug wherein the file extension for URLs with a trailing slash (file.html vs file.html/) were not correctly guessed, thus resulting in incorrect Content-Type headers.
  • Fixed a subtle bug in pecan.config.Configuration attribute/item assignment that caused some types of configuration changes to silently fail.


  • Replaced pecan’s debugger middleware with an (optional) dependency on the backlash package. Developers who want to debug application-level tracebacks interactively should pip install backlash in their development environment.
  • Fixed a Content-Type related bug: when an explicit content_type is specified as an argument to pecan.expose(), it is now given precedence over the application-level default renderer.
  • Fixed a bug that prevented the usage of certain RFC3986-specified characters in path segments.
  • Fixed a bug in pecan.abort which suppressed the original traceback (and prevented monitoring tools like NewRelic from working as effectively).


  • Support for Python 3.2 has been dropped.
  • Added a new feature which allows users to specify custom path segments for controllers. This is especially useful for path segments that are not valid Python identifiers (such as path segments that include certain punctuation characters, like /some/~path~/).
  • Added a new configuration option, app.debugger, which allows developers to specify an alternative debugger to pdb (e.g., ipdb) when performing interactive debugging with pecan’s DebugMiddleware.
  • Changed new quickstart pecan projects to default the pecan log level to DEBUG for development.
  • Fixed a bug that prevented staticmethods from being used as controllers.
  • Fixed a decoding bug in the way pecan handles certain quoted URL path segments and query strings.
  • Fixed several bugs in the way pecan handles Unicode path segments (for example, now you can define pecan routes that contain emoji characters).
  • Fixed several bugs in RestController that caused it to return HTTP 404 Not Found rather than HTTP 405 Method Not Allowed. Additionally, RestController now returns valid Allow headers when HTTP 405 Method Not Allowed is returned.
  • Fixed a bug which allowed special pecan methods (_route, _lookup, _default) to be marked as generic REST methods.
  • Added more emphasis in pecan’s documentation to the need for debug=False in production deployments.


  • Changed pecan to more gracefully handle a few odd request encoding edge cases. Now pecan applications respond with an HTTP 400 (rather than an uncaught UnicodeDecodeError, resulting in an HTTP 500) when:

    • HTTP POST requests are composed of non-Unicode data
    • Request paths contain invalid percent-encoded characters, e.g., /some/path/%aa/
  • Improved verbosity for import-related errors in pecan configuration files, especially those involving relative imports.


  • Fixes a bug that breaks support for multi-value query string variables (e.g., ?check=a&check=b).


  • Improved detection of infinite recursion for PecanHook and pypy. This fixes a bug discovered in pecan + pypy that could result in infinite recursion when using the PecanHook metaclass.
  • Fixed a bug that prevented @exposed controllers from using @staticmethod.
  • Fixed a minor bug in the controller argument calculation.


  • For HTTP POSTs, map JSON request bodies to controller keyword arguments.
  • Improved argspec detection and leniency for wrapped controllers.
  • When path arguments are incorrect for RestController, return HTTP 404, not 400.
  • When detecting non-content for HTTP 204, properly catch UnicodeDecodeError.
  • Fixed a routing bug for generic subcontrollers.
  • Fixed a bug in generic function handling when context locals are disabled.
  • Fixed a bug that mixes up argument order for generic functions.
  • Removed assert for flow control; it can be optimized away with python -O.


  • Fixed an edge case in RestController routing which should have returned an HTTP 400 but was instead raising an exception (and thus, HTTP 500).
  • Fixed an incorrect root logger configuration for quickstarted pecan projects.
  • Added pecan.state.arguments, a new feature for inspecting controller call arguments.
  • Fixed an infinite recursion error in PecanHook application. Subclassing both rest.RestController and hooks.HookController resulted in an infinite recursion error in hook application (which prevented applications from starting).
  • Pecan’s tests are now included in its source distribution.


  • Fixed a bug which causes pecan to mistakenly return HTTP 204 for non-empty response bodies.


  • Added support for disabling the pecan.request and pecan.response threadlocals at the WSGI application level in favor of explicit reference passing. For more information, see Context/Thread-Locals vs. Explicit Argument Passing.
  • Added better support for hook composition via subclassing and mixins. For more information, see Attaching Hooks.
  • Added support for specifying custom request and response implementations at the WSGI application level for people who want to extend the functionality provided by the base classes in webob.
  • Pecan controllers may now return an explicit webob.Response instance to short-circuit Pecan’s template rendering and serialization.
  • For generic methods that return HTTP 405, pecan now generates an Allow header to communicate acceptable methods to the client.
  • Fixed a bug in adherence to RFC2616: if an exposed method returns no response body (or namespace), pecan will now enforce an HTTP 204 response (instead of HTTP 200).
  • Fixed a bug in adherence to RFC2616: when pecan responds with HTTP 204 or HTTP 304, the Content-Type header is automatically stripped (because these types of HTTP responses do not contain body content).
  • Fixed a bug: now when clients request JSON via an Accept header, webob HTTP exceptions are serialized as JSON, not their native HTML representation.
  • Fixed a bug that broke applications which specified default_renderer = json.


  • This release adds formal support for pypy.
  • Added colored request logging to the pecan serve command.
  • Added a scaffold for easily generating a basic REST API.
  • Added the ability to pass arbitrary keyword arguments to pecan.testing.load_test_app.
  • Fixed a recursion-related bug in the error document middleware.
  • Fixed a bug in the gunicorn_pecan command that caused threading.local data to leak between eventlet/gevent green threads.
  • Improved documentation through fixes and narrative tutorials for sample pecan applications.


  • Fixed a trailing slash bug for RestController`s that have a `_lookup method.
  • Cleaned up the WSGI app reference from the threadlocal state on every request (to avoid potential memory leaks, especially when testing).
  • Improved pecan documentation and corrected intersphinx references.
  • pecan supports Python 3.4.


  • Removed memoization of certain controller attributes, which can lead to a memory leak in dynamic controller lookups.


  • Fixed several bugs for RestController.
  • Fixed a bug in security handling for generic controllers.
  • Resolved a bug in _default handlers used in RestController.
  • Persist pecan.request.context across internal redirects.


  • Remove a routing optimization that breaks the WSME pecan plugin.


  • Moved the project to StackForge infrastructure, including Gerrit code review, Jenkins continuous integration, and GitHub mirroring.
  • Added a pecan plugin for the popular uwsgi server.
  • Replaced the simplegeneric dependency with the new functools.singledispatch function in preparation for Python 3.4 support.
  • Optimized pecan’s core dispatch routing for notably faster response times.


  • Made some changes to simplify how pecan.conf.app is passed to new apps.
  • Fixed a routing bug for certain _lookup controller configurations.
  • Improved documentation for handling file uploads.
  • Deprecated the pecan.conf.requestviewer configuration option.


  • on_error hooks can now return a Pecan Response objects.
  • Minor documentation and release tooling updates.


  • Pecan now supports Python 2.6, 2.7, 3.2, and 3.3.


  • Add support for _lookup methods as a fallback in RestController.
  • A variety of improvements to project documentation.


  • Add a variety of optimizations to pecan.core that improve request handling time by approximately 30% for simple object dispatch routing.
  • Store exceptions raised by abort in the WSGI environ so they can be accessed later in the request handling (e.g., by other middleware or pecan hooks).
  • Make TransactionHook more robust so that it isn’t as susceptible to failure when exceptions occur in other pecan hooks within a request.
  • Rearrange quickstart verbiage so users don’t miss a necessary step.


  • Unobfuscate syntax highlighting JavaScript for debian packaging.
  • Extract the scaffold-building tests into tox.
  • Add support for specifying a pecan configuration file via the PECAN_CONFIG environment variable.
  • Fix a bug in DELETE methods in two (or more) nested RestControllers.
  • Add documentation for returning specific HTTP status codes.


  • Include a license, readme, and requirements.txt in distributions.
  • Improve inspection with dir() for pecan.request and pecan.response
  • Fix a bug which prevented pecan applications from being mounted at WSGI virtual paths.


  • Update base project scaffolding tests to be more repeatable.
  • Add an application-level configuration option to disable content-type guessing by URL
  • Fix the wrong test dependency on Jinja, it’s Jinja2.
  • Fix a routing-related bug in RestController. Fixes #156
  • Add an explicit CONTRIBUTING.rst document.
  • Improve visibility of deployment-related docs.
  • Add support for a gunicorn_pecan console script.
  • Remove and annotate a few unused (and py26 alternative) imports.
  • Bug fix: don’t strip a dotted extension from the path unless it has a matching mimetype.
  • Add a test to the scaffold project buildout that ensures pep8 passes.
  • Fix misleading output for $ pecan --version.


  • Fix a bug in SecureController. Resolves #131.
  • Extract debug middleware static file dependencies into physical files.
  • Improve a test that can fail due to a race condition.
  • Improve documentation about configation format and app.py.
  • Add support for content type detection via HTTP Accept headers.
  • Correct source installation instructions in README.
  • Fix an incorrect code example in the Hooks documentation.
  • docs: Fix minor typo in *args Routing example.