summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2010-12-19 12:33:22 -0500
committerChris McDonough <chrism@plope.com>2010-12-19 12:33:22 -0500
commit36cbf3a071fb76c14dde7f4c4e74cd8464e9919f (patch)
tree77bae589ccf2cabacdc5654e3995e31f0da684e1
parent6ee49a1d815cb6fd279e55ddd77ec89a64fcbce9 (diff)
downloadpyramid-36cbf3a071fb76c14dde7f4c4e74cd8464e9919f.tar.gz
pyramid-36cbf3a071fb76c14dde7f4c4e74cd8464e9919f.tar.bz2
pyramid-36cbf3a071fb76c14dde7f4c4e74cd8464e9919f.zip
rearrange traversal and urldispatch chapters
-rw-r--r--docs/index.rst2
-rw-r--r--docs/latexindex.rst2
-rw-r--r--docs/narr/resourcelocation.rst92
-rw-r--r--docs/narr/urldispatch.rst86
4 files changed, 80 insertions, 102 deletions
diff --git a/docs/index.rst b/docs/index.rst
index d1b256e43..77587d2f1 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -39,8 +39,8 @@ Narrative documentation in chapter form explaining how to use
narr/project
narr/startup
narr/resourcelocation
- narr/traversal
narr/urldispatch
+ narr/traversal
narr/hybrid
narr/views
narr/handlers
diff --git a/docs/latexindex.rst b/docs/latexindex.rst
index 6855a1d23..2a8ee1532 100644
--- a/docs/latexindex.rst
+++ b/docs/latexindex.rst
@@ -32,8 +32,8 @@ Narrative Documentation
narr/firstapp
narr/project
narr/resourcelocation
- narr/traversal
narr/urldispatch
+ narr/traversal
narr/hybrid
narr/views
narr/handlers
diff --git a/docs/narr/resourcelocation.rst b/docs/narr/resourcelocation.rst
index aa8eaf23a..401d439fd 100644
--- a/docs/narr/resourcelocation.rst
+++ b/docs/narr/resourcelocation.rst
@@ -6,45 +6,27 @@
Resource Location and View Lookup
---------------------------------
-As a primary job, :app:`Pyramid` provides a mechanism to find and invoke code
-written by the application developer based on parameters present in the
-:term:`request`.
-
:app:`Pyramid` uses two separate but cooperating subsystems to find and
-invoke code written by the application developer: :term:`resource location`
-and :term:`view lookup`.
+invoke :term:`view callable` code written by the application developer:
+:term:`resource location` and :term:`view lookup`.
-- A :app:`Pyramid` :term:`resource location` subsystem is given a
+- First, a :app:`Pyramid` :term:`resource location` subsystem is given a
:term:`request`; it is responsible for finding a :term:`resource` object
based on information present in the request. When a resource is found via
resource location, it becomes known as the :term:`context`.
-- Using the context provided by :term:`resource location`, the :app:`Pyramid`
- :term:`view lookup` subsystem is provided with a :term:`request` and
- :term:`context`. It is then responsible for finding and invoking a
- :term:`view callable`. A view callable is a specific bit of code written
- and registered by the application developer which receives the
+- Next, using the context resource found by :term:`resource location` and the
+ :term:`request`, :term:`view lookup` is then responsible for finding and
+ invoking a :term:`view callable`. A view callable is a specific bit of
+ code written and registered by the application developer which receives the
:term:`request` and which returns a :term:`response`.
These two subsystems are used by :app:`Pyramid` serially: first, a
-:term:`resource location` subsystem does its job. Then the result of context
-finding is passed to the :term:`view lookup` subsystem. The view lookup
-system finds a :term:`view callable` written by an application developer, and
-invokes it. A view callable returns a :term:`response`. The response is
-returned to the requesting user.
-
-.. sidebar:: What Good is A Resource Location Subsystem?
-
- The :term:`URL dispatch` mode of :app:`Pyramid` as well as many other web
- frameworks such as :term:`Pylons` or :term:`Django` actually collapse the
- two steps of resource location and view lookup into a single step. In
- these systems, a URL can map *directly* to a view callable. This makes
- them simpler to understand than systems which use distinct subsystems to
- locate a resource and find a view. However, explicitly finding a resource
- provides extra flexibility. For example, it makes it possible to protect
- your application with declarative context-sensitive instance-level
- :term:`authorization`, which is not well-supported in frameworks that do
- not provide a notion of a resource.
+:term:`resource location` subsystem does its job. Then the result of
+resource location is passed to the :term:`view lookup` subsystem. The view
+lookup system finds a :term:`view callable` written by an application
+developer, and invokes it. A view callable returns a :term:`response`. The
+response is returned to the requesting user.
There are two separate :term:`resource location` subsystems in
:app:`Pyramid`: :term:`traversal` and :term:`URL dispatch`. They can be used
@@ -60,8 +42,11 @@ finding. One chapter which follows describes :term:`view lookup`:
Should I Use Traversal or URL Dispatch for Resource Location?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Since :app:`Pyramid` provides support for both approaches, you can use either
-exclusively or combine them as you see fit.
+When you use :app:`Pyramid`, you have a choice about how you'd like to
+resolve URLs to code: you can use either :term:`traversal` or :term:`URL
+dispatch`. The choice to use traversal vs. URL dispatch is largely
+"religious". Since :app:`Pyramid` provides support for both approaches, you
+can use either exclusively or combine them as you see fit.
:term:`URL dispatch` is very straightforward. When you limit your
application to using URL dispatch, you know every URL that your application
@@ -76,9 +61,9 @@ You just match everything "below" ``members`` to a particular :term:`view
callable`, e.g. ``/members/{memberid}``.
However, URL dispatch is not very convenient if you'd like your URLs to
-represent an arbitrary hierarchy. For example, if you need to infer the
-difference between sets of URLs such as these, where the ``document`` in the
-first URL represents a PDF document, and ``/stuff/page`` in the second
+represent an arbitrary-depth hierarchy. For example, if you need to infer
+the difference between sets of URLs such as these, where the ``document`` in
+the first URL represents a PDF document, and ``/stuff/page`` in the second
represents an OpenOffice document in a "stuff" folder.
.. code-block:: text
@@ -88,22 +73,31 @@ represents an OpenOffice document in a "stuff" folder.
It takes more pattern matching assertions to be able to make hierarchies work
in URL-dispatch based systems, and some assertions just aren't possible.
-Essentially, URL-dispatch based systems just don't deal very well with URLs
-that represent arbitrary-depth hierarchies.
-
-But :term:`traversal` *does* work well for URLs that represent
+URL-dispatch based systems just don't deal very well with URLs that represent
+arbitrary-depth hierarchies.
+
+:term:`URL dispatch` tends to collapse the two steps of :term:`resource
+location` and :term:`view lookup` into a single step. Thus, a URL can map
+*directly* to a view callable. This makes URL dispatch eaiser to understand
+than traversal, because traversal makes you understand how :term:`resource
+location` works. But explicitly locating a resource provides extra
+flexibility. For example, it makes it possible to protect your application
+with declarative context-sensitive instance-level :term:`authorization`.
+
+Unlike URL dispatch, :term:`traversal` works well for URLs that represent
arbitrary-depth hierarchies. Since the path segments that compose a URL are
addressed separately, it becomes very easy to form URLs that represent
arbitrary depth hierarchies in a system that uses traversal. When you're
willing to treat your application resources as a tree that can be traversed,
-it also becomes easy to provide "instance-level security": you just attach a
-security declaration to each resource in the tree. This is not nearly as
-easy to do when using URL dispatch.
-
-In essence, the choice to use traversal vs. URL dispatch is largely
-religious. Traversal dispatch probably just doesn't make any sense when you
-possess completely "square" data stored in a relational database because it
-requires the construction and maintenance of a tree and requires that the
+it also becomes easy to provide "instance-level security": you just attach an
+:term:`ACL` security declaration to each resource in the tree. This is not
+nearly as easy to do when using URL dispatch.
+
+Traversal probably just doesn't make any sense when you possess completely
+"square" data stored in a relational database because it requires the
+construction and maintenance of a resource tree and requires that the
developer think about mapping URLs to code in terms of traversing that tree.
-However, when you have a hierarchical data store, using traversal can provide
-significant advantages over using URL-based dispatch.
+
+We'll examine both :term:`URL dispatch` and :term:`traversal` in the next two
+chapters.
+
diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst
index fb5b97e54..9a9769d23 100644
--- a/docs/narr/urldispatch.rst
+++ b/docs/narr/urldispatch.rst
@@ -6,42 +6,17 @@
URL Dispatch
============
-The URL dispatch feature of :app:`Pyramid` allows you to either augment or
-replace :term:`traversal` as a :term:`resource location` mechanism, allowing
-URL pattern matching to have the "first crack" at resolving a given URL to
-:term:`context` resource.
-
-Although it is a "resource-location" mechanism, ironically, using URL
-dispatch exclusively allows you to avoid thinking about your application in
-terms of resources entirely.
-
-Many applications don't need :app:`Pyramid` features -- such as
-context-sensitive declarative security via an :term:`authorization policy` --
-that benefit from having any visible separation between :term:`resource
-location` and :term:`view lookup`. To this end, URL dispatch provides a
-handy syntax that allows you to effectively map URLs *directly* to
-:term:`view` code in such a way that you needn't think about your application
-in terms of "resource location" at all. This makes developing a
-:app:`Pyramid` application seem more like developing an application in a
-system that is "resource-free", such as :term:`Pylons` or :term:`Django`.
-
-Whether or not you care about "resources", it often makes a lot of sense to
-use :term:`URL dispatch` instead of :term:`traversal` in an application that
-has no natural data hierarchy. For instance, if all the data in your
-application lives in a relational database, and that relational database has
-no self-referencing tables that form a natural hierarchy, URL dispatch is
-easier to use than traversal, and is often a more natural fit for creating an
-application that manipulates "flat" data.
+:term:`URL dispatch` provides a simple way to map URLs :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. If
+no route matches, :app:`Pyramid` falls back to trying to use
+:term:`traversal` to map the current request to a :term:`view callable`.
The presence of calls to the :meth:`pyramid.config.Configurator.add_route`
method within your application is a sign that you're using :term:`URL
dispatch`.
-.. note::
-
- Route configuration may also be added to the system via :term:`ZCML` (see
- :ref:`zcml_route_configuration`).
-
High-Level Operational Overview
-------------------------------
@@ -50,27 +25,31 @@ 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` provided
-to :app:`Pyramid`, a route-specific :term:`context` resource will be
-generated. When this happens, :app:`Pyramid` will shortcut
-:term:`traversal`, and will invoke :term:`view lookup` using the context
-resource and view name generated by URL dispatch. If the matched route names
-a :term:`view callable` in its configuration, that view callable will be
-invoked when view lookup is performed.
+to :app:`Pyramid`, app:`Pyramid` will shortcut :term:`traversal`, and will
+invoke :term:`view lookup` using a :term:`context` resource generated by the
+route match.
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.
+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.
+
Route Configuration
-------------------
:term:`Route configuration` is the act of adding a new :term:`route` to an
application. A route has a *pattern*, representing a pattern meant to match
-against the ``PATH_INFO`` portion of a URL, and a *name*, which is used by
-developers within a :app:`Pyramid` application to uniquely identify a
-particular route when generating a URL. It also optionally has a
-``factory``, a set of :term:`route predicate` parameters, and a set of
-:term:`view` parameters.
+against the ``PATH_INFO`` portion of a URL (the portion following the scheme
+and port, e.g. ``/foo/bar`` in the URL ``http://localhost:8080/foo/bar``),
+and a *route name*, which is used by developers within a :app:`Pyramid`
+application to uniquely identify a particular route when generating a URL.
+It also optionally has a ``factory``, a set of :term:`route predicate`
+parameters, and a set of :term:`view` parameters.
.. index::
single: add_route
@@ -103,10 +82,11 @@ Route Configuration That Names a View Callable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When a route configuration declaration names a ``view`` attribute, the value
-of the attribute will reference a :term:`view callable`. A view callable, as
-described in :ref:`views_chapter`, is developer-supplied code that "does
-stuff" as the result of a request. For more information about how to create
-view callables, see :ref:`views_chapter`.
+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. For more information about how to create view
+callables, see :ref:`views_chapter`.
Here's an example route configuration that references a view callable:
@@ -136,6 +116,9 @@ 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.
+Route View Callable Registration and Lookup Details
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
The purpose of making it possible to specify a view callable within a route
configuration is to prevent developers from needing to deeply understand the
details of :term:`resource location` and :term:`view lookup`. When a route
@@ -146,11 +129,8 @@ the invocation.
For most usage, you needn't understand more than this; how it works is an
implementation detail. In the interest of completeness, however, we'll
-explain how it *does* work in the following section. You can skip it if
-you're uninterested.
-
-Route View Callable Registration and Lookup Details
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+explain how it *does* work in the this section. You can skip it if you're
+uninterested.
When a ``view`` attribute is attached to a route configuration,
:app:`Pyramid` ensures that a :term:`view configuration` is registered that
@@ -1257,3 +1237,7 @@ References
A tutorial showing how :term:`URL dispatch` can be used to create a
:app:`Pyramid` application exists in :ref:`bfg_sql_wiki_tutorial`.
+
+Route configuration may also be added to the system via :term:`ZCML` (see
+:ref:`zcml_route_configuration`).
+