This article explains the new features in :app:`Pyramid` version 1.6 as compared to its predecessor, :app:`Pyramid` 1.5. It also documents backwards incompatibilities between the two versions and deprecations added to :app:`Pyramid` 1.6, as well as software dependency changes and notable documentation additions.
IPython and BPython support have been removed from pshell in the core. To continue using them on Pyramid 1.6+, you must install the binding packages explicitly. One way to do this is by adding
pyramid_ipython
(orpyramid_bpython
) to theinstall_requires
section of your package'ssetup.py
file, then re-runningsetup.py develop
:setup( #... install_requires=[ 'pyramid_ipython', # new dependency 'pyramid', #... ], )
request.response
will no longer be mutated when using the :func:`~pyramid.renderers.render_to_response` API. It is now necessary to pass in aresponse=
argument to :func:`~pyramid.renderers.render_to_response` if you wish to supply the renderer with a custom response object. If you do not pass one, then a response object will be created using the current response factory. Almost all renderers mutate therequest.response
response object (for example, the JSON renderer setsrequest.response.content_type
toapplication/json
). However, when invokingrender_to_response
, it is not expected that the response object being returned would be the same one used later in the request. The response object returned fromrender_to_response
is now explicitly different fromrequest.response
. This does not change the API of a renderer. See Pylons#1563In an effort to combat a common issue it is now a :class:`~pyramid.exceptions.ConfigurationError` to register a view callable that is actually an unbound method when using the default view mapper. As unbound methods do not exist in PY3+ possible errors are detected by checking if the first parameter is named
self
. For example, config.add_view(ViewClass.some_method, ...) should actually be config.add_view(ViewClass, attr='some_method)'. This was always an issue in Pyramid on PY2 but the backward incompatibility is on PY3+ where you may not use a function with the first parameter namedself
. In this case it looks too much like a common error and the exception will be raised. See Pylons#1498
- Python 3.5 and pypy3 compatibility.
pserve --reload
will no longer crash on syntax errors. See Pylons#2044- Cache busting for static resources has been added and is available via a new :meth:`pyramid.config.Configurator.add_cache_buster` API. Core APIs are shipped for both cache busting via query strings and via asset manifests for integrating into custom asset pipelines. See Pylons#1380 and Pylons#1583 and Pylons#2171
- Assets can now be overidden by an absolute path on the filesystem when using
the :meth:`~pyramid.config.Configurator.override_asset` API. This makes it
possible to fully support serving up static content from a mutable directory
while still being able to use the :meth:`~pyramid.request.Request.static_url`
API and :meth:`~pyramid.config.Configurator.add_static_view`. Previously it
was not possible to use :meth:`~pyramid.config.Configurator.add_static_view`
with an absolute path and generate urls to the content. This change
replaces the call,
config.add_static_view('/abs/path', 'static')
, withconfig.add_static_view('myapp:static', 'static')
andconfig.override_asset(to_override='myapp:static/', override_with='/abs/path/')
. Themyapp:static
asset spec is completely made up and does not need to exist—it is used for generating URLs viarequest.static_url('myapp:static/foo.png')
. See Pylons#1252 - Added :meth:`~pyramid.config.Configurator.set_response_factory` and the
response_factory
keyword argument to the constructor of :class:`~pyramid.config.Configurator` for defining a factory that will return a customResponse
class. See Pylons#1499 - Added :attr:`pyramid.config.Configurator.root_package` attribute and init parameter to assist with includible packages that wish to resolve resources relative to the package in which the configurator was created. This is especially useful for add-ons that need to load asset specs from settings, in which case it may be natural for a developer to define imports or assets relative to the top-level package. See Pylons#1337
- Overall improvments for the
proutes
command. Added--format
and--glob
arguments to the command, introduced themethod
column for displaying available request methods, and improved theview
output by showing the module instead of just__repr__
. See Pylons#1488 pserve
can now take a-b
or--browser
option to open the server URL in a web browser. See Pylons#1533- Support keyword-only arguments and function annotations in views in Python 3. See Pylons#1556
- The
append_slash
argument of :meth:`~pyramid.config.Configurator.add_notfound_view()` will now accept anything that implements the :class:`~pyramid.interfaces.IResponse` interface and will use that as the response class instead of the default :class:`~pyramid.httpexceptions.HTTPFound`. See Pylons#1610 - The :class:`~pyramid.config.Configurator` has grown the ability to allow actions to call other actions during a commit cycle. This enables much more logic to be placed into actions, such as the ability to invoke other actions or group them for improved conflict detection. We have also exposed and documented the configuration phases that Pyramid uses in order to further assist in building conforming add-ons. See Pylons#1513
- Allow an iterator to be returned from a renderer. Previously it was only possible to return bytes or unicode. See Pylons#1417
- Improve robustness to timing attacks in the
:class:`~pyramid.authentication.AuthTktCookieHelper` and the
:class:`~pyramid.session.SignedCookieSessionFactory` classes by using the
stdlib's
hmac.compare_digest
if it is available (such as Python 2.7.7+ and 3.3+). See Pylons#1457 - Improve the readability of the
pcreate
shell script output. See Pylons#1453 - Make it simple to define
notfound
andforbidden
views that wish to use the default exception-response view, but with altered predicates and other configuration options. Theview
argument is now optional in :meth:`~pyramid.config.Configurator.add_notfound_view` and :meth:`~pyramid.config.Configurator.add_forbidden_view` See Pylons#494 - The
pshell
script will now load aPYTHONSTARTUP
file if one is defined in the environment prior to launching the interpreter. See Pylons#1448 - Add new HTTP exception objects for status codes
428 Precondition Required
,429 Too Many Requests
and431 Request Header Fields Too Large
inpyramid.httpexceptions
. See https://github.com/Pylons/pyramid/pull/1372/files pcreate
when run without a scaffold argument will now print information on the missing flag, as well as a list of available scaffolds. See Pylons#1566 and Pylons#1297pcreate
will now ask for confirmation if invoked with an argument for a project name that already exists or is importable in the current environment. See Pylons#1357 and Pylons#1837- Add :func:`pyramid.request.apply_request_extensions` function which can be
used in testing to apply any request extensions configured via
config.add_request_method
. Previously it was only possible to test the extensions by going through Pyramid's router. See Pylons#1581 - Make it possible to subclass
pyramid.request.Request
and also usepyramid.request.Request.add_request.method
. See Pylons#1529 - Additional shells for
pshell
can now be registered as entry points. See Pylons#1891 and Pylons#2012 - The variables injected into
pshell
are now displayed with their docstrings instead of the defaultstr(obj)
when possible. See Pylons#1929
The
pserve
command's daemonization features, as well as--monitor-restart
, have been deprecated. This includes the[start,stop,restart,status]
subcommands, as well as the--daemon
,--stop-daemon
,--pid-file
,--status
,--user
, and--group
flags. See Pylons#2120 and Pylons#2189 and Pylons#1641Please use a real process manager in the future instead of relying on
pserve
to daemonize itself. Many options exist, including your operating system's services, such as Systemd or Upstart, as well as Python-based solutions like Circus and Supervisor.See Pylons#1641 and Pylons#2120
The
principal
argument to :func:`pyramid.security.remember` was renamed touserid
. Usingprincipal
as the argument name still works and will continue to work for the next few releases, but a deprecation warning is printed.
- Added line numbers to the log formatters in the scaffolds to assist with debugging. See Pylons#1326
- Updated scaffold generating machinery to return the version of :app:`Pyramid`
and its documentation for use in scaffolds. Updated
starter
,alchemy
andzodb
templates to have links to correctly versioned documentation, and to reflect which :app:`Pyramid` was used to generate the scaffold. - Removed non-ASCII copyright symbol from templates, as this was causing the scaffolds to fail for project generation.
- Removed logging configuration from Quick Tutorial
ini
files, except for scaffolding- and logging-related chapters, to avoid needing to explain it too early. - Improve and clarify the documentation on what :app:`Pyramid` defines as a
principal
and auserid
in its security APIs. See Pylons#1399 - Moved the documentation for
accept
on :meth:`pyramid.config.Configurator.add_view` to no longer be part of the predicate list. See Pylons#1391 for a bug report statingnot_
was failing onaccept
. Discussion with @mcdonc led to the conclusion that it should not be documented as a predicate. See Pylons#1487 for this PR. - Clarify a previously-implied detail of the
ISession.invalidate
API documentation. - Add documentation of command line programs (
p*
scripts). See Pylons#2191