Skip to main content

The Pyramid web application development framework, a Pylons project

Project description


Pyramid is a small, fast, down-to-earth, open source Python web application development framework. It makes real-world web application development and deployment more fun, more predictable, and more productive.

Pyramid is produced by the Pylons Project.

Support and Documentation

See the Pylons Project website to view documentation, report bugs, and obtain support.


Pyramid is offered under the BSD-derived Repoze Public License.


Pyramid is made available by Agendaless Consulting and a team of contributors.

1.3a6 (2012-01-20)


  • New API: pyramid.config.Configurator.set_request_property. Add lazy property descriptors to a request without changing the request factory. This method provides conflict detection and is the suggested way to add properties to a request.
  • Responses generated by Pyramid’s static_view now use a wsgi.file_wrapper (see when one is provided by the web server.

Bug Fixes

1.3a5 (2012-01-09)

Bug Fixes

Backwards Incompatibilities

  • The path_info route and view predicates now match against request.upath_info (Unicode) rather than request.path_info (indeterminate value based on Python 3 vs. Python 2). This has to be done to normalize matching on Python 2 and Python 3.

1.3a4 (2012-01-05)


  • New API: pyramid.request.Request.set_property. Add lazy property descriptors to a request without changing the request factory. New properties may be reified, effectively caching the value for the lifetime of the instance. Common use-cases for this would be to get a database connection for the request or identify the current user.
  • Use the waitress WSGI server instead of wsgiref in scaffolding.

Bug Fixes

  • The documentation of indicated that using it as a decorator with no arguments like this:

    def somefunc(event):

    Would register somefunc to receive all events sent via the registry, but this was untrue. Instead, it would receive no events at all. This has now been fixed and the code matches the documentation. See also

  • Literal portions of route patterns were not URL-quoted when route_url or route_path was used to generate a URL or path.

  • The result of route_path or route_url might have been unicode or str depending on the input. It is now guaranteed to always be str.

  • URL matching when the pattern contained non-ASCII characters in literal parts was indeterminate. Now the pattern supplied to add_route is assumed to be either: a unicode value, or a str value that contains only ASCII characters. If you now want to match the path info from a URL that contains high order characters, you can pass the Unicode representation of the decoded path portion in the pattern.

  • When using a traverse= route predicate, traversal would fail with a URLDecodeError if there were any high-order characters in the traversal pattern or in the matched dynamic segments.

  • Using a dynamic segment named traverse in a route pattern like this:

    config.add_route('trav_route', 'traversal/{traverse:.*}')

    Would cause a UnicodeDecodeError when the route was matched and the matched portion of the URL contained any high-order characters. See .

  • When using a *traverse stararg in a route pattern, a URL that matched that possessed a @@ in its name (signifying a view name) would be inappropriately quoted by the traversal machinery during traversal, resulting in the view not being found properly. See and .

Backwards Incompatibilities

  • String values passed to route_url or route_path that are meant to replace “remainder” matches will now be URL-quoted except for embedded slashes. For example:

    config.add_route('remain', '/foo*remainder')
    request.route_path('remain', remainder='abc / def')
    # -> '/foo/abc%20/%20def'

    Previously string values passed as remainder replacements were tacked on untouched, without any URL-quoting. But this doesn’t really work logically if the value passed is Unicode (raw unicode cannot be placed in a URL or in a path) and it is inconsistent with the rest of the URL generation machinery if the value is a string (it won’t be quoted unless by the caller).

    Some folks will have been relying on the older behavior to tack on query string elements and anchor portions of the URL; sorry, you’ll need to change your code to use the _query and/or _anchor arguments to route_path or route_url to do this now.

  • If you pass a bytestring that contains non-ASCII characters to add_route as a pattern, it will now fail at startup time. Use Unicode instead.

1.3a3 (2011-12-21)


  • Added a prequest script (along the lines of paster request). It is documented in the “Command-Line Pyramid” chapter in the section entitled “Invoking a Request”.
  • Add undocumented __discriminator__ API to derived view callables. e.g. adapters.lookup(...).__discriminator__(context, request). It will be used by superdynamic systems that require the discriminator to be used for introspection after manual view lookup.

Bug Fixes

  • Normalized exit values and -h output for all p* scripts (pviews, proutes, etc).


  • Added a section named “Making Your Script into a Console Script” in the “Command-Line Pyramid” chapter.
  • Removed the “Running Pyramid on Google App Engine” tutorial from the main docs. It survives on in the Cookbook ( Rationale: it provides the correct info for the Python 2.5 version of GAE only, and this version of Pyramid does not support Python 2.5.

1.3a2 (2011-12-14)


  • New API: pyramid.view.view_defaults. If you use a class as a view, you can use the new view_defaults class decorator on the class to provide defaults to the view configuration information used by every @view_config decorator that decorates a method of that class. It also works against view configurations involving a class made imperatively.
  • Added a backwards compatibility knob to pcreate to emulate paster create handling for the --list-templates option.
  • Changed scaffolding machinery around a bit to make it easier for people who want to have extension scaffolds that can work across Pyramid 1.0.X, 1.1.X, 1.2.X and 1.3.X. See the new “Creating Pyramid Scaffolds” chapter in the narrative documentation for more info.


  • Added documentation to “View Configuration” narrative documentation chapter about view_defaults class decorator.
  • Added API docs for view_defaults class decorator.
  • Added an API docs chapter for pyramid.scaffolds.
  • Added a narrative docs chapter named “Creating Pyramid Scaffolds”.

Backwards Incompatibilities

  • The template_renderer method of pyramid.scaffolds.PyramidScaffold was renamed to render_template. If you were overriding it, you’re a bad person, because it wasn’t an API before now. But we’re nice so we’re letting you know.

1.3a1 (2011-12-09)


  • Python 3.2 compatibility.
  • New pyramid.compat module and API documentation which provides Python 2/3 straddling support for Pyramid add-ons and development environments.
  • A mako.directories setting is no longer required to use Mako templates Rationale: Mako template renderers can be specified using an absolute asset spec. An entire application can be written with such asset specs, requiring no ordered lookup path.
  • bpython interpreter compatibility in pshell. See the “Command-Line Pyramid” narrative docs chapter for more information.
  • Added get_appsettings API function to the pyramid.paster module. This function returns the settings defined within an [app:...] section in a PasteDeploy ini file.
  • Added setup_logging API function to the pyramid.paster module. This function sets up Python logging according to the logging configuration in a PasteDeploy ini file.
  • Configuration conflict reporting is reported in a more understandable way (“Line 11 in file…” vs. a repr of a tuple of similar info).
  • A configuration introspection system was added; see the narrative documentation chapter entitled “Pyramid Configuration Introspection” for more information. New APIs: pyramid.registry.Introspectable, pyramid.config.Configurator.introspector, pyramid.config.Configurator.introspectable, pyramid.registry.Registry.introspector.
  • Allow extra keyword arguments to be passed to the pyramid.config.Configurator.action method.
  • New APIs: pyramid.path.AssetResolver and pyramid.path.DottedNameResolver. The former can be used to resolve asset specifications, the latter can be used to resolve dotted names to modules or packages.

Bug Fixes

Backwards Incompatibilities

  • Pyramid no longer runs on Python 2.5 (which includes the most recent release of Jython and the Python 2.5 version of GAE as of this writing).
  • The paster command is no longer the documented way to create projects, start the server, or run debugging commands. To create projects from scaffolds, paster create is replaced by the pcreate console script. To serve up a project, paster serve is replaced by the pserve console script. New console scripts named pshell, pviews, proutes, and ptweens do what their paster <commandname> equivalents used to do. Rationale: the Paste and PasteScript packages do not run under Python 3.
  • The default WSGI server run as the result of pserve from newly rendered scaffolding is now the wsgiref WSGI server instead of the paste.httpserver server. Rationale: Rationale: the Paste and PasteScript packages do not run under Python 3.
  • The pshell command (see “paster pshell”) no longer accepts a --disable-ipython command-line argument. Instead, it accepts a -p or --python-shell argument, which can be any of the values python, ipython or bpython.
  • Removed the pyramid.renderers.renderer_from_name function. It has been deprecated since Pyramid 1.0, and was never an API.
  • To use ZCML with versions of Pyramid >= 1.3, you will need pyramid_zcml version >= 0.8 and zope.configuration version >= 3.8.0. The pyramid_zcml package version 0.8 is backwards compatible all the way to Pyramid 1.0, so you won’t be warned if you have older versions installed and upgrade Pyramid “in-place”; it may simply break instead.


  • Pyramid no longer depends on the zope.component package, except as a testing dependency.
  • Pyramid now depends on a zope.interface>=3.8.0, WebOb>=1.2dev, repoze.lru>=0.4, zope.deprecation>=3.5.0, translationstring>=0.4 (for Python 3 compatibility purposes). It also, as a testing dependency, depends on WebTest>=1.3.1 for the same reason.
  • Pyramid no longer depends on the Paste or PasteScript packages.


  • The SQLAlchemy Wiki tutorial has been updated. It now uses @view_config decorators and an explicit database population script.
  • Minor updates to the ZODB Wiki tutorial.
  • A narrative documentation chapter named “Extending Pyramid Configuration” was added; it describes how to add a new directive, and how use the pyramid.config.Configurator.action method within custom directives. It also describes how to add introspectable objects.
  • A narrative documentation chapter named “Pyramid Configuration Introspection” was added. It describes how to query the introspection system.


  • Rendered scaffolds have now been changed to be more relocatable (fewer mentions of the package name within files in the package).
  • The routesalchemy scaffold has been renamed alchemy, replacing the older (traversal-based) alchemy scaffold (which has been retired).
  • The starter scaffold now uses URL dispatch by default.

Project details

Release history Release notifications

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
pyramid-1.3a6.tar.gz (2.3 MB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page