Skip to main content

The Pyramid Web Framework, a Pylons project

Project description


1.8-branch Travis CI Status 1.8-branch Documentation Status Latest Documentation Status IRC Freenode

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

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('', 8080, app)

Pyramid is a project of the Pylons Project.

Support and Documentation

See Pyramid Support and Development for documentation, reporting bugs, and getting support.

Developing and Contributing

See HACKING.txt and for guidelines on running tests, adding features, coding style, and updating documentation when developing in or contributing to Pyramid.


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


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

1.8.1 (2017-01-24)

  • Restore the pyramid.registry.Registry signature that forwards extra *args, **kwargs to zope.interface.registry.Components allowing implementations to specify a custom registry with bases. See

1.8 (2017-01-21)

  • No major changes from 1.8b1.

1.8b1 (2017-01-17)


Documentation Changes

1.8a1 (2016-12-25)

Backward Incompatibilities

  • Support for the IContextURL interface that was deprecated in Pyramid 1.3 has been removed. See

  • Following the Pyramid deprecation period (1.6 -> 1.8), daemon support for pserve has been removed. This includes removing the daemon commands (start, stop, restart, status) as well as the following arguments: --daemon, --pid-file, --log-file, --monitor-restart, --status, --user, --group, --stop-daemon

    To run your server as a daemon you should use a process manager instead of pserve.


  • pcreate is now interactive by default. You will be prompted if a file already exists with different content. Previously if there were similar files it would silently skip them unless you specified --interactive or --overwrite. See

  • Removed undocumented argument cachebust_match from pyramid.static.static_view. This argument was shipped accidentally in Pyramid 1.6. See

  • Change static view to avoid setting the Content-Encoding response header to an encoding guessed using Python’s mimetypes module. This was causing clients to decode the content of gzipped files when downloading them. The client would end up with a foo.txt.gz file on disk that was already decoded, thus should really be foo.txt. Also, the Content-Encoding should only have been used if the client itself broadcast support for the encoding via Accept-Encoding request headers. See

  • Settings are no longer accessible as attributes on the settings object (e.g. This was deprecated in Pyramid 1.2. See


  • Python 3.6 compatibility.

  • pcreate learned about --package-name to allow you to create a new project in an existing folder with a different package name than the project name. See

  • The _get_credentials private method of BasicAuthAuthenticationPolicy has been extracted into standalone function extract_http_basic_credentials in pyramid.authentication module, this function extracts HTTP Basic credentials from a request object, and returns them as a named tuple. See

  • Pyramid 1.4 silently dropped a feature of the configurator that has been restored. It’s again possible for action discriminators to conflict across different action orders. See

  • pyramid.paster.bootstrap and its sibling pyramid.scripting.prepare can now be used as context managers to automatically invoke the closer and pop threadlocals off of the stack to prevent memory leaks. See

  • Added pyramid.config.Configurator.add_exception_view and the pyramid.view.exception_view_config decorator. It is now possible using these methods or via the new exception_only=True option to add_view to add a view which will only be matched when handling an exception. Previously any exception views were also registered for a traversal context that inherited from the exception class which prevented any exception-only optimizations. See

  • Added the exception_only boolean to pyramid.interfaces.IViewDeriverInfo which can be used by view derivers to determine if they are wrapping a view which only handles exceptions. This means that it is no longer necessary to perform request-time checks for request.exception to determine if the view is handling an exception - the pipeline can be optimized at config-time. See

  • pserve should now work with gevent and other workers that need to monkeypatch the process, assuming the server and / or the app do so as soon as possible before importing the rest of pyramid. See

  • Pyramid no longer copies the settings object passed to the pyramid.config.Configurator(settings=). The original dict is kept. See

  • The csrf trusted origins setting may now be a whitespace-separated list of domains. Previously only a python list was allowed. Also, it can now be set using the PYRAMID_CSRF_TRUSTED_ORIGINS environment variable similar to other settings. See

  • pserve --reload now uses the hupper <> library to monitor file changes. This comes with many improvements:

    • If the watchdog package is installed then monitoring will be done using inotify instead of cpu and disk-intensive polling.
    • The monitor is now a separate process that will not crash and starts up before any of your code.
    • The monitor will not restart the process after a crash until a file is saved.
    • The monitor works on windows.
    • You can now trigger a reload manually from a pyramid view or any other code via hupper.get_reloader().trigger_reload(). Kind of neat.
    • You can trigger a reload by issuing a SIGHUP to the monitor process.


  • A new [pserve] section is supported in your config files with a watch_files key that can configure pserve --reload to monitor custom file paths. See

  • Allow streaming responses to be made from subclasses of pyramid.httpexceptions.HTTPException. Previously the response would be unrolled while testing for a body, making it impossible to stream a response. See

  • Update starter, alchemy and zodb scaffolds to support IPv6 by using the new listen directives in waitress. See

  • All p* scripts now use argparse instead of optparse. This improves their --help output as well as enabling nicer documentation of their options. See

  • Any deferred configuration action registered via config.action may now depend on threadlocal state, such as asset overrides, being active when the action is executed. See

  • Asset specifications for directories passed to config.add_translation_dirs now support overriding the entire asset specification, including the folder name. Previously only the package name was supported and the folder would always need to have the same name. See

  • config.begin() will propagate the current threadlocal request through as long as the registry is the same. For example:

    request = Request.blank(...)
    config.begin(request)  # pushes a request
    config.begin()         # propagates the previous request through unchanged
    assert get_current_request() is request


Bug Fixes

  • Fixed bug in proutes such that it now shows the correct view when a class and attr is involved. See:
  • Fix a FutureWarning in Python 3.5 when using re.split on the format setting to the proutes script. See
  • Fix a RuntimeWarning emitted by WebOb when using arbitrary objects as the userid in the AuthTktAuthenticationPolicy. This is now caught by the policy and the object is serialized as a base64 string to avoid the cryptic warning. Since the userid will be read back as a string on subsequent requests a more useful warning is emitted encouraging you to use a primitive type instead. See
  • Pyramid 1.6 introduced the ability for an action to invoke another action. There was a bug in the way that config.add_view would interact with custom view derivers introduced in Pyramid 1.7 because the view’s discriminator cannot be computed until view derivers and view predicates have been created in earlier orders. Invoking an action from another action would trigger an unrolling of the pipeline and would compute discriminators before they were ready. The new behavior respects the order of the action and ensures the discriminators are not computed until dependent actions from previous orders have executed. See
  • Fix bug in i18n where the default domain would always use the Germanic plural style, even if a different plural function is defined in the relevant messages file. See
  • The config.override_asset method now occurs during pyramid.config.PHASE1_CONFIG such that it is ordered to execute before any calls to config.add_translation_dirs. See


Documentation Changes

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.8.1-py2.py3-none-any.whl (572.8 kB) Copy SHA256 hash SHA256 Wheel py2.py3
pyramid-1.8.1.tar.gz (2.6 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