631 lines
23 KiB
Text
631 lines
23 KiB
Text
Version 2.5.1 - February 07, 2012
|
|
---------------------------------
|
|
- Bug fix release related to request charset in old versions of
|
|
WebOb.
|
|
|
|
Version 2.5 - February 01, 2012
|
|
-------------------------------
|
|
|
|
Version 2.4 - January 23, 2012
|
|
------------------------------
|
|
- Maintenance release. Fixed outstanding bugs related to App Engine.
|
|
- Removed webapp2_extras/protorpc, broken since webapp2 was added
|
|
to App Engine.
|
|
|
|
|
|
Version 2.3 - August 24, 2011
|
|
-----------------------------
|
|
- webapp2.Response.out creates a reference loop that impedes garbage
|
|
collection. Changing it to a property fixed this (Issue #15).
|
|
- webapp2_extras.i18n:
|
|
- When in debug mode, translations are not cached, so compiling new
|
|
translations make them readily available (Issue #13).
|
|
- webapp2_extras.auth:
|
|
- ATTENTION: auth_id is no longer converted to lower case to retrieve
|
|
a key or save a new user in webapp2_extras.appengine.auth.models.User.
|
|
This is a more general approach, as not all systems use case-insensitive
|
|
user ids. If you want case-insensitive auth ids, convert them to lower
|
|
case before passing auth ids to the auth module (Issue #14).
|
|
- If user data is missing attributes, don't raise AssertionError.
|
|
Simply don't save or return a valid session, instead.
|
|
- call user_model.get_id() instead of the ndb-specific user.key.id().
|
|
- removed set_password_validator() and set_token_validator().
|
|
They add complexity to the API without a use case to justify.
|
|
Extend AuthStore to achieve the same thing.
|
|
|
|
|
|
Version 2.2.3 - August 6, 2011
|
|
------------------------------
|
|
- Version 2.2.2 missed the webapp2_extras.appengine package.
|
|
|
|
- get_app() and get_request() now test that app and request are set, to avoid
|
|
hard to debug stack traces when they are not and the local proxy is used.
|
|
|
|
|
|
Version 2.2.2 - August 5, 2011 (more 2's than ever!)
|
|
----------------------------------------------------
|
|
- A default charset is always set in the Request object: if it is not defined
|
|
in the constructor, environ['CONTENT_TYPE'] is checked; and if it is still
|
|
not defined 'utf-8' is used.
|
|
|
|
- Added token_model as an attribute of the User model; it is used instead of
|
|
the hardcoded class.
|
|
|
|
|
|
Version 2.2.1 - August 1st, 2011
|
|
--------------------------------
|
|
- Fixed a bug in WSGIApplication.run() when running outside of App Engine:
|
|
CGIHandler().run(app) -> CGIHandler().run(self). (issue 9)
|
|
|
|
|
|
Version 2.2 - July 30, 2011
|
|
===========================
|
|
- Revised webapp2_extras.auth and simplified User model, by Kyle Finley.
|
|
Thanks!
|
|
|
|
|
|
Version 2.1 - July 29, 2011
|
|
===========================
|
|
- Added webapp2_extras.auth: high-level utilities for authentication and
|
|
authorization.
|
|
|
|
- Added webapp2_extras.appengine.auth.models: default model implementations
|
|
for webapp2_extras.auth (can be overridden).
|
|
|
|
- Added webapp2_extras.appengine.ndb.unique_model: a model to store unique
|
|
values. This was added mainly so that the default user model can have
|
|
multiple unique properties.
|
|
|
|
- import_string() now displays useful debug information when it fails.
|
|
|
|
- To make things clearly separated specially for those using webapp2
|
|
outside of App Engine, from now on all App Engine-specific modules will
|
|
be placed in webapp2_extras.appengine. Also three modules were moved to
|
|
the new package:
|
|
|
|
- webapp2_extras.sessions_memcache
|
|
- webapp2_extras.sessions_ndb
|
|
- webapp2_extras.users
|
|
|
|
The original modules were not removed, though: they will be kept in the same
|
|
place for compatibility purposes, just importing their stuff from the new
|
|
locations.
|
|
|
|
- Config.load_config() now makes a copy of the configuration when user_values
|
|
are passed. That keyword is meant to override app configuration, so the
|
|
previous behavior was actually wrong. This is a side feature not used inside
|
|
webapp2 or even well documented so the change should not affect existing
|
|
apps.
|
|
|
|
|
|
Version 2.0.2 - July 18, 2011
|
|
=============================
|
|
- cached_property now uses threading.RLock for thread-safety.
|
|
|
|
|
|
Version 2.0.1 - July 17, 2011
|
|
=============================
|
|
- Little fix: use google.appengine.ext.webapp.util if available, like before.
|
|
|
|
|
|
Version 2.0 - July 17, 2011
|
|
===========================
|
|
- Added support for the (not yet released) App Engine Python 2.7 SDK.
|
|
|
|
- Deprecated webapp2_extras.local_app. WSGIApplication is now thread-safe
|
|
by default when webapp2_extras.local is available.
|
|
webapp2_extras.local_app.WSGIApplication can still be imported, but it is
|
|
just an alias to webapp2.WSGIApplication (and a deprecation warning is
|
|
emitted when it is imported).
|
|
|
|
- Like DomainRoute, PathPrefixRoute now only tests the nested routes if the
|
|
prefix matches. So now it is not only convenient but matches smartly and
|
|
faster. ;)
|
|
|
|
- Added webapp2_extras.security, with security related helpers such as secure
|
|
password hashing tools.
|
|
|
|
- webapp2_extras.sessions:
|
|
- Now uses webapp2_extras.security.create_token() to generate session IDs
|
|
instead of uuid.
|
|
- Added 'backends' configuration: get_session() can now be called passing
|
|
a more convenient 'backend' key. Default ones are 'securecookie',
|
|
'datastore' and 'memcache'.
|
|
|
|
- get_build_routes() now yields (name, route) instead of simply route. This
|
|
will allow routes with nested routes to act as a proxy to build URIs.
|
|
|
|
- webapp2.urlunsplit() was removed from the public API.
|
|
|
|
- Variables names in routes must now look like python identifiers -
|
|
this means that they can no longer start with a number, like before.
|
|
|
|
- Removed support for _anchor in uri_for() -- the documented keyword is
|
|
_fragment.
|
|
|
|
- Removed support for handler functions receiving (request, response). The
|
|
correct arguments for function handlers are (request, *args, **kwargs).
|
|
|
|
- webapp2_extras.json:
|
|
- Fixed an issue with importing json on non-GAE environments (missing
|
|
absolute import).
|
|
- Now imports simplejson directly instead of using the one from Django,
|
|
since it is now included in the App Engine SDK (since version 1.4.2).
|
|
|
|
- Added WSGIApplication.clear_globals(). Instead of
|
|
app.set_globals(app=None, request=None), use app.clear_globals().
|
|
|
|
|
|
Version 1.8.1 - June 29, 2011
|
|
=============================
|
|
- Implemented an adapter mechanism to dispatch different kind of handlers:
|
|
webapp.RequestHandler, webapp2.RequestHandler and "view functions".
|
|
Instead of monkeypatching handlers (adding a 'factory' attribute),
|
|
handlers are wrapped by adapters that do the appropriate dispatch.
|
|
How handlers are adapted can be overridden using the convenience method
|
|
``set_adapter()`` from the Router class, but the common cases are covered.
|
|
|
|
- Function views now conveniently receive (request, *args, **kwargs), like
|
|
in Django. The previous arguments will work, but they are now deprecated
|
|
and will not be supported in the future. This is a major incompatibility
|
|
with previous versions but it feels a lot better than the previous
|
|
(request, response) behavior, as adapters make it easy to have custom
|
|
dispatch arguments using a unified API.
|
|
The webapp2.RequestHandler class remain unchanged and is instantiated with
|
|
(request, response).
|
|
|
|
|
|
Version 1.8 - June 26, 2011
|
|
===========================
|
|
- webap2_extras.i18n: the functions passed to I18nStore.set_locale_selector()
|
|
and I18nStore.set_timezone_selector() now receive (store, request) instead of
|
|
(request, store), for consistency with the router custom callables.
|
|
|
|
- webap2_extras.json:
|
|
- json is imported first trying direct simplejson, then built-in json
|
|
(for Python >= 2.6), then the one from django.utils (for App Engine).
|
|
- All convenience functions now receive *args, **kwargs to be passed to
|
|
encode()/decode().
|
|
|
|
- Added webapp2_extras.mako.
|
|
|
|
- Added webapp2.redirect_to.
|
|
|
|
- Added Request.blank() parameters compatible with WebOb >= 1.0: POST and
|
|
**kwargs.
|
|
|
|
- Increased compatibility with wsgiref.headers.Headers, used by
|
|
webapp.Response.
|
|
|
|
|
|
Version 1.7.5 - June 20, 2011
|
|
=============================
|
|
- Implemented methods from ``wsgiref.headers.Headers``, used by
|
|
webapp.Response.headers.
|
|
|
|
|
|
Version 1.7.4 - June 19, 2011
|
|
=============================
|
|
- Fixed bug in response.status_message.
|
|
|
|
|
|
Version 1.7.3 - June 17, 2011
|
|
=============================
|
|
- Routes can now only match specific schemes, e.g., 'http' or 'https'.
|
|
|
|
- Added a tutorial to use webapp2 outside of App Engine.
|
|
|
|
|
|
Version 1.7.2 - June 16, 2011
|
|
=============================
|
|
- Response is now compatible with latest WebOb.
|
|
|
|
- Increased Response compatibility with webapp, implementing wsgi_write() and
|
|
has_error().
|
|
|
|
- Changed some status messages to be the same as webapp:
|
|
- 203: 'Non-Authoritative Information'
|
|
- 302: 'Moved Temporarily'
|
|
- 306: 'Unused'
|
|
- 408: 'Request Time-out'
|
|
- 414: 'Request-URI Too Large'
|
|
- 504: 'Gateway Time-out'
|
|
- 505: 'HTTP Version not supported'
|
|
|
|
- Copied Request from webapp, so that when using webapp2 outside of the SDK
|
|
they are the same.
|
|
|
|
- Routes now match the Request path unquoted. See App Engine issue #2636
|
|
for an explanation.
|
|
|
|
|
|
Version 1.7.1 - June 14, 2011
|
|
=============================
|
|
- Added standalone redirect() function.
|
|
|
|
- RequestHandler.redirect and redirect_to now return a response object.
|
|
|
|
- Fixed: multiple routes that define methods are tried before MethodNotAllowed
|
|
is raised.
|
|
|
|
- Updated webapp2_extras.protorpc to work with latest ProtoRPC.
|
|
|
|
|
|
Version 1.7 - June 4, 2011
|
|
==========================
|
|
- Added a simple configuration object for WSGIapplication, available in the
|
|
config attribute. Extras modules that use configuration (i18n, jinja2,
|
|
sessions) don't require app.config to be set manually anymore. Still, the
|
|
`secret_key` key config for sessions, if not defined, will result in an
|
|
exception.
|
|
|
|
- Deprecated webapp2_extras.config, replaced by the simpler app dict.
|
|
|
|
- Router no longer receives app on construction, for consistency with the
|
|
config object. App is set as global before router is initialized.
|
|
|
|
- Fixed a bug in webapp2_extras.sessions that made it not save the session
|
|
when it was empty (like when flashes are popped).
|
|
|
|
- Added standalone uri_for function, to be used in templates.
|
|
|
|
|
|
Version 1.6.3 - June 3, 2011
|
|
============================
|
|
- Added webap2_extras.local_app, with the WSGIApplication previously in
|
|
webap2_extras.local. This allows using LocalProxy on App Engine, without
|
|
actually monkeypatching the WSGI app for threaded environments.
|
|
|
|
- Route now raises exc.HTTPMethodNotAllowed if methods are set and the request
|
|
method doesn't match.
|
|
|
|
- Router.default_matcher() now raises exc.HTTPNotFound if no route matches.
|
|
|
|
|
|
Version 1.6.2 - May 30, 2011
|
|
============================
|
|
- WSGIApplication.__call__ checks if the dispatcher didn't return None to
|
|
accept the returned value as a response. Previously it checked if it was an
|
|
instance of Response.
|
|
|
|
- To support returned response, RequestHandler.dispatch() returns the result of
|
|
the dispatched method.
|
|
|
|
Version 1.6.1 - May 30, 2011
|
|
============================
|
|
- Fixed an indentation bug in webapp2_extras.users.
|
|
|
|
- Added back _to_utf8() to convert values for import_string() and urlunsplit().
|
|
|
|
- Added WSGIApplication.get_response(), a convenience for unit tests.
|
|
|
|
|
|
Version 1.6 - May 29, 2011
|
|
==========================
|
|
- Handlers registered in WSGIApplication.error_handlers can now also be a
|
|
string to be lazily imported.
|
|
|
|
- The request object now has the active response available as an attribute:
|
|
request.response.
|
|
|
|
- Added a factory method to RequestHandler, to better deal with libraries that
|
|
use a custom webapp.RequestHandler constructors (like ProtoRPC).
|
|
|
|
- Added set_dispatcher() to Router, to set extended dispatching.
|
|
|
|
- Handlers and error handlers can now return a response object, which will be
|
|
used instead of the default response created by the WSGI app. This allows
|
|
webapp2 to be used following the common pattern of handlers that return a
|
|
response, instead of the webapp way of a handler that writes to an existing
|
|
response.
|
|
|
|
- Request.Handler.redirect() now can receive a `code` parameter, to set the
|
|
status code. This is preferable than the `permanent` parameter, kept for
|
|
compatibility with webapp.
|
|
|
|
- webapp2 is now a file webapp2.py, instead of a package with a __init__.py
|
|
file.
|
|
|
|
- API cleanup:
|
|
- Removed WSGIApplication.url_for(), to_unicode(), to_utf8().
|
|
- RequestHandler.url_for was renamed to uri_for, with url_for kept
|
|
as an alias.
|
|
- Renamed webapp2_extras.routes.ImprovedRoute to RedirectRoute, as it
|
|
basically adds redirect conveniences.
|
|
- For consistency with uri building parameters, RedirectHandler parameters
|
|
are now prefixed with a underscore: `url` becomes `_uri` and `permanent`
|
|
becomes `_permanent`. A parameter `_code` was added to set status code.
|
|
- Router.do_match and do_build renamed to default_matcher and
|
|
default_dispatcher.
|
|
- URI building accepts a _fragment argument, with _anchor as fallback.
|
|
|
|
|
|
Version 1.5 - May 16, 2011
|
|
==========================
|
|
- Added webapp2_extras.local, with an extended WSGIApplication that uses
|
|
thread-local for globals and so can be used outside of App Engine.
|
|
|
|
- Added webapp2_extras.protorpc, with support for Google ProtoRPC.
|
|
|
|
- Added set_matcher() and set_builder() to Router, to set extended matcher and
|
|
builder.
|
|
|
|
- Routes now return the route on match() or routes with nested routes cannot
|
|
work. So instead of returning (args, kwargs) they return
|
|
(route, args, kwargs).
|
|
|
|
- Now handlers only receive **args if no named variables are set. Otherwise,
|
|
they only receive **kwargs. This allows users to use regexes that are not
|
|
intended to be captured, mixing named and unnamed variables.
|
|
|
|
- DomainRoute now uses the same syntax used by webapp2.Route, instead of a
|
|
regex. The resulting keywords are added to the mathed route **kwargs.
|
|
This gives control of what is passed to the handler if a domain/subdomain
|
|
matches, and allows to not pass anything if no regex groups are defined.
|
|
|
|
- Several small bugs fixed and increased test coverage in webapp2_extras.
|
|
|
|
|
|
Version 1.3 - May 9, 2011
|
|
=========================
|
|
- Added webapp2_extras modules:
|
|
- webapp2_extras.i18n: internationalization support.
|
|
- webapp2_extras.sessions_memcache: memcache based sessions.
|
|
- webapp2_extras.sessions_ndb: datastore based sessions.
|
|
- Several api improvements in webapp2_extras.
|
|
|
|
|
|
Version 1.2 - May 6, 2011
|
|
=========================
|
|
- Removed Config from webapp2 core. It is now part of the new "webapp2_extras"
|
|
package.
|
|
- Added the package webapp2_extras. These are all optional modules that
|
|
complement webapp2 with common functionalities. Currently they include:
|
|
- webapp2_extras.config: Configuration object.
|
|
- webapp2_extras.jinja2: Support for Jinja2 templating.
|
|
- webapp2_extras.json: JSON utilities.
|
|
- webapp2_extras.routes: Extended route classes.
|
|
- webapp2_extras.securecookie: Signed cookie serializer.
|
|
- webapp2_extras.sessions: Sessions support.
|
|
|
|
|
|
Version 1.1 - May 5, 2011
|
|
=========================
|
|
- Simplified routing with an unified dispatch method for classes and functions.
|
|
|
|
|
|
Version 1.0 - May 1st, 2011
|
|
===========================
|
|
This is a major refactoring with some incompatible changes, mostly internal
|
|
stuff that won't be noticed in common usage.
|
|
|
|
- Changed signature of RequestHandler's constructor: it now receives only
|
|
(request, response) instead of (app, request, response).
|
|
|
|
- Added RequestContext class, which should help testing.
|
|
|
|
- Added .app attribute to Request, a reference to the active app.
|
|
|
|
- Refactored routing scheme:
|
|
- Now also supports function views besides classes.
|
|
- Now also supports normal functions as exception handlers, and exception
|
|
handlers don't need to be a subclass RequestHandler (but still can).
|
|
- Now also supports custom handler methods besides using the request method.
|
|
|
|
- Removed Request.context: was redundant with Request.registry.
|
|
|
|
- Renamed WSGIApplication.wsgi_app to WSGIApplication.dispatch.
|
|
|
|
- Moved ALLOWED_METHODS to WSGIApplication.allowed_methods.
|
|
|
|
- Moved get_valid_methods() to RequestHandler.get_valid_methods().
|
|
|
|
|
|
Version 0.7 - September 26, 2010
|
|
================================
|
|
- Added WSGIApplication.app and WSGIApplication.request, class attributes set
|
|
on each request to reference currently active app and request.
|
|
WSGIApplication.app is an alias to WSGIApplication.active_instance.
|
|
|
|
- Fixed double escaping of + in urlunsplit(). Thanks, alkis.
|
|
|
|
- IMPROVED: configuration now behaves exactly like a dictionary, still
|
|
auto-loading configuration values when needed and honoring required configs.
|
|
For example, we always used this::
|
|
|
|
bar = self.app.get_config('foo', 'bar')
|
|
|
|
Now it is also possible to use direct access and dict methods::
|
|
|
|
bar = self.app.config['foo']['bar']
|
|
# or...
|
|
bar = self.app.config['foo'].get('bar')
|
|
# or...
|
|
bar = self.app.config.get('foo').get('bar')
|
|
|
|
The previous get_config() method works as always.
|
|
|
|
|
|
Version 0.6 - August 31, 2010
|
|
=============================
|
|
- Fix: Anchors in generated URLs are quoted using urlib.quote, instead of
|
|
urlib.quote_plus.
|
|
|
|
- In Router.dispatch(), if an exception occurs while handling an exception,
|
|
raise it instead of trying to handle it again.
|
|
|
|
- Fixed bug when writing a unicode string to Response and charset is not set.
|
|
Thanks to martinc for the patch.
|
|
|
|
- Changed: the app won't fallback anymore to the exception handler set for
|
|
status 500 if handlers for other status are not set.
|
|
|
|
- Changed: exceptions are only logged when unhandled. It is up to exception
|
|
handlers to log them when appropriate.
|
|
|
|
|
|
Version 0.5.1 - August 17, 2010
|
|
===============================
|
|
- When a URL matches, some attributes are set in the request object:
|
|
- request.route: the matched route
|
|
- request.route_args: the matched positional arguments, a tuple
|
|
- request.route_kwargs: the matched keyword arguments, a dict
|
|
|
|
- WSGIApplication.handle_exception() doesn't automatically raises the exception
|
|
when in debug mode: it is up to the error handler to raise it if in dev; it
|
|
will be raised if no error handler is defined to handle it anyway.
|
|
|
|
- Added attributes, WSGIApplication.registry, Request.registry and
|
|
Request.context, dictionaries for objects in use during the app or request
|
|
lifetimes.
|
|
|
|
- Before passing the request method to the RequestHandler, '-' is replaced
|
|
by '_', so that a method like WebDav's 'VERSION-CONTROL' can be supported.
|
|
|
|
- Config.get() now only returns the passed default value when key is defined.
|
|
This is the intended, more predictable behavior: default is a default for
|
|
the key, not the module. For example::
|
|
|
|
# If config['foo']['bar'] is not set, return 'baz'.
|
|
config.get('foo', 'bar', default='baz')
|
|
|
|
# If config['foo'] is not set, return None. Default is ignored here.
|
|
config.get('foo', default='baz')
|
|
|
|
- Router initialization now receives the app as parameter, so that extended
|
|
routes can access app's config.
|
|
|
|
|
|
Version 0.5 - August 13, 2010
|
|
=============================
|
|
- Better compatibility with webapp:
|
|
- webapp2.WSGIapplication can be used with webapp.RequestHandler.
|
|
- webapp.WSGIapplication can be used with webapp2.RequestHandler.
|
|
|
|
Although the functionality becomes limited in both cases, this should help
|
|
migration.
|
|
|
|
- Review of Response based on observations from
|
|
http://pythonpaste.org/webob/differences.html#webapp-response:
|
|
|
|
- Response.out is now a reference to self, to use webob.Response's neat
|
|
.write() method which can handle both string and unicode.
|
|
- Response.clear() now sets .body = '' instead of .app_iter = [].
|
|
|
|
- Added Response.write(), for compatibility with StringIO behavior in webapp
|
|
when calling write() passing non-basestring values (issue 2).
|
|
|
|
- Removed url_escape() and url_unescape(). Unused or almost unused.
|
|
|
|
- ErrorHandlers can now be defined as strings to be lazily loaded, as they
|
|
now use the same dispatch mechanism of other handlers.
|
|
|
|
Backwards compatibility warning
|
|
-------------------------------
|
|
- The method handle_exception() is called from app-wide error handlers.
|
|
Previously, get() was called.
|
|
|
|
|
|
Version 0.4.1 - August 08, 2010
|
|
===============================
|
|
- Removed router parameter from get_routes(), get_match_routes(),
|
|
get_build_routes(). This simplifies multi-routes quite a bit.
|
|
|
|
|
|
Version 0.4 - August 07, 2010
|
|
=============================
|
|
- redirect() and redirect_to() now accept a keyword argument 'abort' to raise
|
|
an exception to do the redirect.
|
|
|
|
- '_netloc' can be passed to url_for() build URLs for a given domain or
|
|
subdomain.
|
|
|
|
- Added BaseRoute, an interface for custom routes. Several improvements make
|
|
the routing system more extensible, while the default Route class sticks to
|
|
the basics.
|
|
|
|
- Nested routes are now possible. As an example, `extras/routes.py` has several
|
|
classes that accept nested routes or extend routing in other ways:
|
|
|
|
- PathPrefixRoute: the idea of this route is to set a base path for other
|
|
routes::
|
|
|
|
app = WSGIApplication([
|
|
PathPrefixRoute('/users/<user:\w+>', [
|
|
Route('/', UserOverviewHandler, 'user-overview'),
|
|
Route('/profile', UserProfileHandler, 'user-profile'),
|
|
Route('/projects', UserProjectsHandler, 'user-projects'),
|
|
]),
|
|
])
|
|
|
|
The example above is the same as setting the following routes, just more
|
|
convenient as you can reuse the path prefix::
|
|
|
|
app = WSGIApplication([
|
|
Route('/users/<user:\w+>/', UserOverviewHandler, 'user-overview'),
|
|
Route('/users/<user:\w+>/profile', UserProfileHandler, 'user-profile'),
|
|
Route('/users/<user:\w+>/projects', UserProjectsHandler, 'user-projects'),
|
|
])
|
|
|
|
- NamePrefixRoute: Same as PathPrefixRoute, but prefixes the names of routes.
|
|
|
|
- HandlerPrefixRoute: Same as PathPrefixRoute, but prefixes the handlers of
|
|
routes.
|
|
|
|
- DomainRoute: a route used to restrict route matches to a given domain or
|
|
subdomain.
|
|
|
|
For example, to restrict routes to a subdomain of the appspot domain::
|
|
|
|
SUBDOMAIN_RE = '^([^.]+)\.app-id\.appspot\.com$'
|
|
|
|
app = WSGIApplication([
|
|
DomainRoute(SUBDOMAIN_RE, [
|
|
Route('/foo', 'FooHandler', 'subdomain-thing'),
|
|
]),
|
|
Route('/bar', 'BarHandler', 'normal-thing'),
|
|
])
|
|
|
|
- ImprovedRoute: a route with redirect_to and strict_slash.
|
|
|
|
- `redirect_to`: if set, the route is used to redirect to a URL. The value
|
|
can be a URL string or a callable that returns a URL. These two are
|
|
equivalent::
|
|
|
|
route = Route('/foo', RedirectHandler, defaults={'url': '/bar'})
|
|
route = Route('/foo', redirect_to='/bar')
|
|
|
|
- `strict_slash`: if True, redirects access to the same URL with different
|
|
trailing slash to the strict path defined in the rule. For example, take
|
|
these rules::
|
|
|
|
route = Route('/foo', FooHandler, strict_slash=True)
|
|
route = Route('/bar/', BarHandler, strict_slash=True)
|
|
|
|
Because **strict_slash** is True, this is what will happen:
|
|
|
|
- Access to ``/foo`` will execute ``FooHandler`` normally.
|
|
- Access to ``/bar/`` will execute ``BarHandler`` normally.
|
|
- Access to ``/foo/`` will redirect to ``/foo``.
|
|
- Access to ``/bar`` will redirect to ``/bar/``.
|
|
|
|
|
|
Version 0.3 - August 05, 2010
|
|
=============================
|
|
- Routes store the handler, as we had in 0.1. This allows custom routes to
|
|
have nested routes.
|
|
- Much improved URL building, now delegated to routes.
|
|
- added urlunsplit() helper.
|
|
|
|
|
|
Version 0.2 - August 04, 2010
|
|
=============================
|
|
- Fixed a bug in Route.match() that would make it return positional arguments
|
|
with wrong order. Dictionary is correctly sorted now.
|
|
- Added build_only option for routes: routes that are only used for url_for()
|
|
and never match.
|
|
|
|
|
|
Version 0.1 - August 03, 2010
|
|
=============================
|
|
- Initial release.
|