summaryrefslogtreecommitdiff
path: root/docs/narr/urldispatch.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/narr/urldispatch.rst')
-rw-r--r--docs/narr/urldispatch.rst297
1 files changed, 112 insertions, 185 deletions
diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst
index f94ed3ba8..61c9770c6 100644
--- a/docs/narr/urldispatch.rst
+++ b/docs/narr/urldispatch.rst
@@ -6,28 +6,12 @@
URL Dispatch
============
-:term:`URL dispatch` provides a simple way to map URLs to :term:`view`
-code using a simple pattern matching language. An ordered set of
-patterns is checked one-by-one. If one of the patterns matches the path
-information associated with a request, a particular :term:`view
-callable` is invoked.
-
-:term:`URL dispatch` is one of two ways to perform :term:`resource
-location` in :app:`Pyramid`; the other way is using :term:`traversal`.
-If no route is matched using :term:`URL dispatch`, :app:`Pyramid` falls
-back to :term:`traversal` to handle the :term:`request`.
-
-It is the responsibility of the :term:`resource location` subsystem
-(i.e., :term:`URL dispatch` or :term:`traversal`) to find the resource
-object that is the :term:`context` of the :term:`request`. Once the
-:term:`context` is determined, :term:`view lookup` is then responsible
-for finding and invoking a :term:`view callable`. A view callable is a
-specific bit of code, defined in your application, that receives the
-:term:`request` and returns a :term:`response` object.
-
-Where appropriate, we will describe how view lookup interacts with
-:term:`resource location`. The :ref:`view_config_chapter` chapter describes
-the details of :term:`view lookup`.
+:term:`URL dispatch` provides a simple way to map URLs to :term:`view` code
+using a simple pattern matching language. An ordered set of patterns is
+checked one-by-one. If one of the patterns matches the path information
+associated with a request, a particular :term:`view callable` is invoked. A
+view callable is a specific bit of code, defined in your application, that
+receives the :term:`request` and returns a :term:`response` object.
High-Level Operational Overview
-------------------------------
@@ -37,18 +21,14 @@ If route configuration is present in an application, the :app:`Pyramid`
matching patterns present in a *route map*.
If any route pattern matches the information in the :term:`request`,
-:app:`Pyramid` will invoke :term:`view lookup` using a :term:`context`
-resource generated by the route match.
+:app:`Pyramid` will invoke :term:`view lookup` to find a matching view.
-However, if no route pattern matches the information in the :term:`request`
-provided to :app:`Pyramid`, it will fail over to using :term:`traversal` to
-perform resource location and view lookup.
+If no route pattern in the route map matches the information in the
+:term:`request` provided in your application, :app:`Pyramid` will fail over
+to using :term:`traversal` to perform resource location and view lookup.
-Technically, URL dispatch is a :term:`resource location` mechanism (it finds
-a context object). But ironically, using URL dispatch (instead of
-:term:`traversal`) allows you to avoid thinking about your application in
-terms of "resources" entirely, because it allows you to directly map a
-:term:`view callable` to a route.
+.. index::
+ single: route configuration
Route Configuration
-------------------
@@ -67,8 +47,8 @@ attributes.
.. _config-add-route:
-Configuring a Route via The ``add_route`` Configurator Method
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Configuring a Route to Match a View
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The :meth:`pyramid.config.Configurator.add_route` method adds a single
:term:`route configuration` to the :term:`application registry`. Here's an
@@ -84,90 +64,45 @@ example:
config.add_route('myroute', '/prefix/{one}/{two}')
config.add_view(myview, route_name='myroute')
-.. versionchanged:: 1.0a4
- Prior to 1.0a4, routes allow for a marker starting with a ``:``, for
- example ``/prefix/:one/:two``. This style is now deprecated
- in favor of ``{}`` usage which allows for additional functionality.
-
-.. index::
- single: route configuration; view callable
-
-.. _add_route_view_config:
-
-Route Configuration That Names a View Callable
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. warning:: This section describes a feature which has been deprecated in
- Pyramid 1.1 and higher. In order to reduce confusion and documentation
- burden, passing view-related parameters to
- :meth:`~pyramid.config.Configurator.add_route` is deprecated.
-
- In versions earlier than 1.1, a view was permitted to be connected to a
- route using a set of ``view*`` parameters passed to the
- :meth:`~pyramid.config.Configurator.add_route`. This was a shorthand
- which replaced the need to perform a subsequent call to
- :meth:`~pyramid.config.Configurator.add_view` as described in
- :ref:`config-add-route`. For example, it was valid (and often recommended)
- to do:
+When a :term:`view callable` added to the configuration by way of
+:meth:`~pyramid.config.Configurator.add_view` bcomes associated with a route
+via its ``route_name`` predicate, that view callable will always be found and
+invoked when the associated route pattern matches during a request.
- .. code-block:: python
+More commonly, you will not use any ``add_view`` statements in your project's
+"setup" code, instead only using ``add_route`` statements using a
+:term:`scan` for to associate view callables with routes. For example, if
+this is a portion of your project's ``__init__.py``:
- config.add_route('home', '/', view='mypackage.views.myview',
- view_renderer='some/renderer.pt')
-
- Instead of the equivalent:
-
- .. code-block:: python
-
- config.add_route('home', '/')
- config.add_view('mypackage.views.myview', route_name='home')
- renderer='some/renderer.pt')
-
- Passing ``view*`` arguments to ``add_route`` as shown in the first
- example above is now deprecated in favor of connecting a view to a
- predefined route via :meth:`~pyramid.config.Configurator.add_view` using
- the route's ``route_name`` parameter, as shown in the second example
- above.
+.. code-block:: python
- A deprecation warning is now issued when any view-related parameter is
- passed to ``Configurator.add_route``. The recommended way to associate a
- view with a route is documented in :ref:`config-add-route`.
+ # in your project's __init__.py (mypackage.__init__)
-When a route configuration declaration names a ``view`` attribute, the value
-of the attribute will reference a :term:`view callable`. This view callable
-will be invoked when the route matches. A view callable, as described in
-:ref:`views_chapter`, is developer-supplied code that "does stuff" as the
-result of a request.
+ config.add_route('myroute', '/prefix/{one}/{two}')
+ config.scan('mypackage')
-Here's an example route configuration that references a view callable:
+Note that we don't call :meth:`~pyramid.config.Configurator.add_view` in this
+setup code. However, the above :term:`scan` execution
+``config.scan('mypackage')`` will pick up all :term:`configuration
+decoration`, including any objects decorated with the
+:class:`pyramid.view.view_config` decorator in the ``mypackage`` Python
+pakage. For example, if you have a ``views.py`` in your package, a scan will
+pick up any of its configuration decorators, so we can add one there that
+that references ``myroute`` as a ``route_name`` parameter:
.. code-block:: python
- :linenos:
- # "config" below is presumed to be an instance of the
- # pyramid.config.Configurator class; "myview" is assumed
- # to be a "view callable" function
- from myproject.views import myview
- config.add_route('myroute', '/prefix/{one}/{two}', view=myview)
-
-You can also pass a :term:`dotted Python name` as the ``view`` argument
-rather than an actual callable:
-
-.. code-block:: python
- :linenos:
+ # in your project's views.py module (mypackage.views)
- # "config" below is presumed to be an instance of the
- # pyramid.config.Configurator class; "myview" is assumed
- # to be a "view callable" function
- config.add_route('myroute', '/prefix/{one}/{two}',
- view='myproject.views.myview')
+ from pyramid.view import view_config
+ from pyramid.response import Response
-When a route configuration names a ``view`` attribute, the :term:`view
-callable` named as that ``view`` attribute will always be found and invoked
-when the associated route pattern matches during a request.
+ @view_config(route_name='myroute')
+ def myview(request):
+ return Response('OK')
-See :meth:`pyramid.config.Configurator.add_route` for a description of
-view-related arguments.
+THe above combination of ``add_route`` and ``scan`` is completely equivalent
+to using the previous combination of ``add_route`` and ``add_view``.
.. index::
single: route path pattern syntax
@@ -365,12 +300,11 @@ Route Declaration Ordering
Route configuration declarations are evaluated in a specific order when a
request enters the system. As a result, the order of route configuration
-declarations is very important.
-
-The order that routes declarations are evaluated is the order in which they
-are added to the application at startup time. This is unlike
-:term:`traversal`, which depends on emergent behavior which happens as a
-result of traversing a resource tree.
+declarations is very important. The order that routes declarations are
+evaluated is the order in which they are added to the application at startup
+time. (This is unlike a different way of mapping URLs to code that
+:app:`Pyramid` provides, named :term:`traversal`, which does not depend on
+pattern ordering).
For routes added via the :mod:`~pyramid.config.Configurator.add_route` method,
the order that routes are evaluated is the order in which they are added to
@@ -426,6 +360,9 @@ a separate :term:`ACL`, as documented in
combine URL dispatch with :term:`traversal` as documented within
:ref:`hybrid_chapter`.
+.. index::
+ single: route configuration arguments
+
Route Configuration Arguments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -439,13 +376,17 @@ the associated route to be considered a match during the route matching
process. Examples of route predicate arguments are ``pattern``, ``xhr``, and
``request_method``.
-Other arguments are view configuration related arguments. These only have an
-effect when the route configuration names a ``view``. These arguments have
-been deprecated as of :app:`Pyramid` 1.1 (see :ref:`add_route_view_config`).
-
Other arguments are ``name`` and ``factory``. These arguments represent
neither predicates nor view configuration information.
+.. warning:: Some arguments are view-configuration related arguments, such as
+ ``view_renderer``. These only have an effect when the route configuration
+ names a ``view`` and these arguments have been deprecated as of
+ :app:`Pyramid` 1.1.
+
+.. index::
+ single: route predicates (custom)
+
.. _custom_route_predicates:
Custom Route Predicates
@@ -578,32 +519,38 @@ that the year match argument is '2010' if and only if the route name is
See also :class:`pyramid.interfaces.IRoute` for more API documentation about
route objects.
+.. index::
+ single: route matching
+
Route Matching
--------------
The main purpose of route configuration is to match (or not match) the
``PATH_INFO`` present in the WSGI environment provided during a request
-against a URL path pattern.
+against a URL path pattern. ``PATH_INFO`` represents the path portion of the
+URL that was requested.
The way that :app:`Pyramid` does this is very simple. When a request enters
the system, for each route configuration declaration present in the system,
-:app:`Pyramid` checks the ``PATH_INFO`` against the pattern declared.
-
-If any route matches, the route matching process stops. The :term:`request`
-is decorated with a special :term:`interface` which describes it as a "route
-request", the :term:`context` resource is generated, and the context and the
-resulting request are handed off to :term:`view lookup`. During view lookup,
-if a :term:`view callable` associated with the matched route is found, that
-view is called.
+:app:`Pyramid` checks the request's ``PATH_INFO`` against the pattern
+declared. This checking happens in the order that the routes were declared
+via :meth:`pyramid.config.Configurator.add_route`.
When a route configuration is declared, it may contain :term:`route
predicate` arguments. All route predicates associated with a route
declaration must be ``True`` for the route configuration to be used for a
-given request.
-
-If any predicate in the set of :term:`route predicate` arguments provided to
-a route configuration returns ``False``, that route is skipped and route
-matching continues through the ordered set of routes.
+given request during a check. If any predicate in the set of :term:`route
+predicate` arguments provided to a route configuration returns ``False``
+during a check, that route is skipped and route matching continues through
+the ordered set of routes.
+
+If any route matches, the route matching process stops and the :term:`view
+lookup` subsystem takes over to find the most reasonable view callable for
+the matched route. Most often, there's only one view that will match (a view
+configured with a ``route_name`` argument matching the matched route). To
+gain a better understanding of how routes and views are associated in a real
+application, you can use the ``paster pviews`` command, as documented in
+:ref:`displaying_matching_views`.
If no route matches after all route patterns are exhausted, :app:`Pyramid`
falls back to :term:`traversal` to do :term:`resource location` and
@@ -789,6 +736,9 @@ representing a :term:`SQLAlchemy` model.
single: matching the root URL
single: root url (matching)
+.. index::
+ pair: matching; root URL
+
Matching the Root URL
---------------------
@@ -958,6 +908,9 @@ The ``notfound_view`` supplied must adhere to the two-argument view callable
calling convention of ``(context, request)`` (``context`` will be the
exception object).
+.. index::
+ single: cleaning up after request
+
.. _cleaning_up_after_a_request:
Cleaning Up After a Request
@@ -1041,6 +994,9 @@ our sample ``Article`` factory class is not very ambitious.
.. note:: See :ref:`security_chapter` for more information about
:app:`Pyramid` security and ACLs.
+.. index::
+ pair: debugging; route matching
+
.. _debug_routematch_section:
Debugging Route Matching
@@ -1049,7 +1005,7 @@ Debugging Route Matching
It's useful to be able to take a peek under the hood when requests that enter
your application arent matching your routes as you expect them to. To debug
route matching, use the ``PYRAMID_DEBUG_ROUTEMATCH`` environment variable or the
-``debug_routematch`` configuration file setting (set either to ``true``).
+``pyramid.debug_routematch`` configuration file setting (set either to ``true``).
Details of the route matching decision for a particular request to the
:app:`Pyramid` application will be printed to the ``stderr`` of the console
which you started the application from. For example:
@@ -1072,45 +1028,12 @@ which you started the application from. For example:
See :ref:`environment_chapter` for more information about how, and where to
set these values.
-.. index::
- pair: routes; printing
- single: paster proutes
-
-.. _displaying_application_routes:
-
-Displaying All Application Routes
----------------------------------
-
-You can use the ``paster proutes`` command in a terminal window to print a
-summary of routes related to your application. Much like the ``paster
-pshell`` command (see :ref:`interactive_shell`), the ``paster proutes``
-command accepts two arguments. The first argument to ``proutes`` is the path
-to your application's ``.ini`` file. The second is the ``app`` section name
-inside the ``.ini`` file which points to your application.
+You can also use the ``paster proutes`` command to see a display of all the
+routes configured in your application; for more information, see
+:ref:`displaying_application_routes`.
-For example:
-
-.. code-block:: text
- :linenos:
-
- [chrism@thinko MyProject]$ ../bin/paster proutes development.ini MyProject
- Name Pattern View
- ---- ------- ----
- home / <function my_view>
- home2 / <function my_view>
- another /another None
- static/ static/*subpath <static_view object>
- catchall /*subpath <function static_view>
-
-``paster proutes`` generates a table. The table has three columns: a Name
-name column, a Pattern column, and a View column. The items listed in the
-Name column are route names, the items listen in the Pattern column are route
-patterns, and the items listed in the View column are representations of the
-view callable that will be invoked when a request matches the associated
-route pattern. The view column may show ``None`` if no associated view
-callable could be found. If no routes are configured within your
-application, nothing will be printed to the console when ``paster proutes``
-is executed.
+.. index::
+ pair: route; view callable lookup details
Route View Callable Registration and Lookup Details
---------------------------------------------------
@@ -1139,24 +1062,28 @@ when the route pattern is matched during a request. To do so:
object is decorated with the route-specific interface.
- The fact that the request is decorated with a route-specific interface
- causes the view lookup machinery to always use the view callable registered
- using that interface by the route configuration to service requests that
- match the route pattern.
-
-In this way, we supply a shortcut to the developer. Under the hood, the
-:term:`resource location` and :term:`view lookup` subsystems provided by
-:app:`Pyramid` are still being utilized, but in a way which does not require
-a developer to understand either of them in detail. It also means that we
-can allow a developer to combine :term:`URL dispatch` and :term:`traversal`
-in various exceptional cases as documented in :ref:`hybrid_chapter`.
-
-To gain a better understanding of how routes and views are associated in a
-real application, you can use the ``paster pviews`` command, as documented
-in :ref:`displaying_matching_views`.
+ causes the :term:`view lookup` machinery to always use the view callable
+ registered using that interface by the route configuration to service
+ requests that match the route pattern.
+
+As we can see from the above description, technically, URL dispatch doesn't
+actually map a URL pattern directly to a view callable. Instead, URL
+dispatch is a :term:`resource location` mechanism. A :app:`Pyramid`
+:term:`resource location` subsystem (i.e., :term:`URL dispatch` or
+:term:`traversal`) finds a :term:`resource` object that is the
+:term:`context` of a :term:`request`. Once the :term:`context` is determined,
+a separate subsystem named :term:`view lookup` is then responsible for
+finding and invoking a :term:`view callable` based on information available
+in the context and the request. When URL dispatch is used, the resource
+location and view lookup subsystems provided by :app:`Pyramid` are still
+being utilized, but in a way which does not require a developer to understand
+either of them in detail.
+
+If no route is matched using :term:`URL dispatch`, :app:`Pyramid` falls back
+to :term:`traversal` to handle the :term:`request`.
References
----------
A tutorial showing how :term:`URL dispatch` can be used to create a
:app:`Pyramid` application exists in :ref:`bfg_sql_wiki_tutorial`.
-