A web micro-framework
Improved startup time for apps with lots of middleware
fresco.context no longer copies values from the parent when setting up a new request context. This makes it easier for libraries using fresco.context to cache resources per-request.
Bugfix for FrescoApp.requestcontext, which was creating duplicate context frames.
FrescoApp.view_finished signal now passes the request object to subscribers
Route objects can now take a tuple of positional args to pass to views:
Route(POST, '/contact', args=('firstname.lastname@example.org',))
The route class used by RouteCollection is now configurable, allowing apps to define custom routing classes.
fresco.routearg.RouteKwarg has been renamed to RouteArg and now works for positional arguments via Route(..., args=...)
Request.make_url now accepts two new optional arguments, query_add and query_replace. This facilitates building urls based on the current query string with selected values added or replaced.
Bugfix: improperly encoded paths now cause a 400 bad response to be returned rather than raising UnicodeDecodeError
- FrescoApp.requestcontext() now invokes all registered middleware. This can be useful for testing views that rely on middleware to set environ keys or provide other services
- RouteArg classes have been expanded and are now in a separate module, fresco.routeargs
- Bugfix: Request.form was not handling unicode data in GET requests correctly
- fresco.core.request_class has been moved to FrescoApp.request_class
- Route arguments can take default arguments for url generation
- Added tox for testing: fresco is now tested and works with Python 2.6, 2.7, 3.2 and 3.3
- Bugfix: Request.make_url was double quoting URLs in some circumstances
- Improved handling for ResponseExceptions raised during route traversal
- Bugfix: routing arguments were being incorrectly converted to bytestrings in python2
- Bugfix: urlfor works correctly with dynamic routes
Note that upgrading to this version will require changes to your application
- View functions are no longer passed a request object as a positional argument
- The syntax used to reference views by name has changed from urlfor('mymodule:view') to urlfor('mymodule.view').
- Routing: named routes are now supported, eg Route('/', GET, myview, name='homepage'). These can later be accessed by eg urlfor('homepage'). The old route tagging facility has been removed.
- Routing: Support for delegating paths to other routeable objects
- fresco.exceptions.NotFoundFinal has been replaced by NotFound(final=True)
- Experimental Python 3 support
- Bugfix: setting the logger property on a FrescoApp no longer causes errors
- FrescoApp objects now have an options dictionary for application level settings
- Added serve_static_file function
- Added support for signals with blinker
- urlfor now requires fully qualified module names if called with a string argument
- Bug: URL generation broken when HTTP_HOST does not contain port number
- Bugfixes for beaker session support and broken URL generation when ‘X-Forwarded-SSL: off’ header supplied
- Removed dependency on Pesto