Files changed (1)
+There's a new "cherryd" daemon script! This can save a *lot* of boilerplate in your app startup script.
In 3.0, the Engine would create the Request and Response objects. In 3.1, the Application object has that responsibility via its get_serving and release_serving methods. This makes the request object overridable per-app, and also removes the dependency on the engine object.
The wsgiserver module is now more extendable in a couple of ways. Most visibly, the thread pool is now a delegate, so you can replace the builtin one if you need fancy thread pooling (or none at all). The ability to dispatch to multiple apps has also been moved out into its own piece of middleware (WSGIPathInfoDispatcher), which is replaceable. It's also not loaded if you're only deploying one app, so you don't pay the performance penalty of multiple apps.
+CherryPy now works with '''Google App Engine'''! The wsgiserver is now imported lazily-enough to avoid illegal imports of the socket module.
HTTP responses between 400 and 599 can now be generated by custom functions you provide. See help(cherrypy.request.[wiki:ErrorsAndExceptions#AnticipatedHTTPresponses error_page]) for more information.
+You can also set the access file log format more easily now. There's a new 'log.access_log_format' config option--see the code for complete details on the available formats.
+CherryPy 3.1 also changed its access log format slightly to be more secure and stable. Like Apache started doing in 2.0.46, non-printable and other special characters are escaped using \xhh sequences, where hh stands for the hexadecimal representation of the raw byte. Exceptions from this rule are " and \, which are escaped by prepending a backslash, and all whitespace characters, which are written in their C-style notation (\\n, \\t, etc). It's a lot like repr().
We hope to add little improvements to the scaffolding application as we go, to help enable good CherryPy code and avoid common pitfalls. So feel free to recommend some!