123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- """When it comes to combining multiple controller or view functions
- (however you want to call them) you need a dispatcher. A simple way
- would be applying regular expression tests on the ``PATH_INFO`` and
- calling registered callback functions that return the value then.
- This module implements a much more powerful system than simple regular
- expression matching because it can also convert values in the URLs and
- build URLs.
- Here a simple example that creates a URL map for an application with
- two subdomains (www and kb) and some URL rules:
- .. code-block:: python
- m = Map([
- # Static URLs
- Rule('/', endpoint='static/index'),
- Rule('/about', endpoint='static/about'),
- Rule('/help', endpoint='static/help'),
- # Knowledge Base
- Subdomain('kb', [
- Rule('/', endpoint='kb/index'),
- Rule('/browse/', endpoint='kb/browse'),
- Rule('/browse/<int:id>/', endpoint='kb/browse'),
- Rule('/browse/<int:id>/<int:page>', endpoint='kb/browse')
- ])
- ], default_subdomain='www')
- If the application doesn't use subdomains it's perfectly fine to not set
- the default subdomain and not use the `Subdomain` rule factory. The
- endpoint in the rules can be anything, for example import paths or
- unique identifiers. The WSGI application can use those endpoints to get the
- handler for that URL. It doesn't have to be a string at all but it's
- recommended.
- Now it's possible to create a URL adapter for one of the subdomains and
- build URLs:
- .. code-block:: python
- c = m.bind('example.com')
- c.build("kb/browse", dict(id=42))
- 'http://kb.example.com/browse/42/'
- c.build("kb/browse", dict())
- 'http://kb.example.com/browse/'
- c.build("kb/browse", dict(id=42, page=3))
- 'http://kb.example.com/browse/42/3'
- c.build("static/about")
- '/about'
- c.build("static/index", force_external=True)
- 'http://www.example.com/'
- c = m.bind('example.com', subdomain='kb')
- c.build("static/about")
- 'http://www.example.com/about'
- The first argument to bind is the server name *without* the subdomain.
- Per default it will assume that the script is mounted on the root, but
- often that's not the case so you can provide the real mount point as
- second argument:
- .. code-block:: python
- c = m.bind('example.com', '/applications/example')
- The third argument can be the subdomain, if not given the default
- subdomain is used. For more details about binding have a look at the
- documentation of the `MapAdapter`.
- And here is how you can match URLs:
- .. code-block:: python
- c = m.bind('example.com')
- c.match("/")
- ('static/index', {})
- c.match("/about")
- ('static/about', {})
- c = m.bind('example.com', '/', 'kb')
- c.match("/")
- ('kb/index', {})
- c.match("/browse/42/23")
- ('kb/browse', {'id': 42, 'page': 23})
- If matching fails you get a ``NotFound`` exception, if the rule thinks
- it's a good idea to redirect (for example because the URL was defined
- to have a slash at the end but the request was missing that slash) it
- will raise a ``RequestRedirect`` exception. Both are subclasses of
- ``HTTPException`` so you can use those errors as responses in the
- application.
- If matching succeeded but the URL rule was incompatible to the given
- method (for example there were only rules for ``GET`` and ``HEAD`` but
- routing tried to match a ``POST`` request) a ``MethodNotAllowed``
- exception is raised.
- """
- from .converters import AnyConverter as AnyConverter
- from .converters import BaseConverter as BaseConverter
- from .converters import FloatConverter as FloatConverter
- from .converters import IntegerConverter as IntegerConverter
- from .converters import PathConverter as PathConverter
- from .converters import UnicodeConverter as UnicodeConverter
- from .converters import UUIDConverter as UUIDConverter
- from .converters import ValidationError as ValidationError
- from .exceptions import BuildError as BuildError
- from .exceptions import NoMatch as NoMatch
- from .exceptions import RequestAliasRedirect as RequestAliasRedirect
- from .exceptions import RequestPath as RequestPath
- from .exceptions import RequestRedirect as RequestRedirect
- from .exceptions import RoutingException as RoutingException
- from .exceptions import WebsocketMismatch as WebsocketMismatch
- from .map import Map as Map
- from .map import MapAdapter as MapAdapter
- from .matcher import StateMachineMatcher as StateMachineMatcher
- from .rules import EndpointPrefix as EndpointPrefix
- from .rules import parse_converter_args as parse_converter_args
- from .rules import Rule as Rule
- from .rules import RuleFactory as RuleFactory
- from .rules import RuleTemplate as RuleTemplate
- from .rules import RuleTemplateFactory as RuleTemplateFactory
- from .rules import Subdomain as Subdomain
- from .rules import Submount as Submount
|