Skip to content

Commit

Permalink
Trivial traversal-in-views example; hopefully this adds an easy way t…
Browse files Browse the repository at this point in the history
…o quickly 'get' traversal
  • Loading branch information
slinkp committed Jan 30, 2012
1 parent 9007350 commit 9b9e5cf
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 1 deletion.
3 changes: 2 additions & 1 deletion CONTRIBUTORS.txt
Expand Up @@ -105,4 +105,5 @@ Blaise Laflamme, 12/27/2010
Casey Duncan, 12/27/2010 Casey Duncan, 12/27/2010
Michael Merickel, 3/30/2011 Michael Merickel, 3/30/2011
Charlie Choiniere, 4/23/2011 Charlie Choiniere, 4/23/2011
Steve Piercy, 5/10/2011 Steve Piercy, 5/10/2011
Paul Winkler, 1/30/2012
1 change: 1 addition & 0 deletions index.rst
Expand Up @@ -27,6 +27,7 @@ The Pyramid Cookbook presents topical, practical usages of :mod:`Pyramid`.
deployment/index.rst deployment/index.rst
porting porting
testing testing
traversal_in_views
traversal traversal
cmf/index.rst cmf/index.rst
mac_install mac_install
Expand Down
4 changes: 4 additions & 0 deletions traversal.rst
Expand Up @@ -152,3 +152,7 @@ This is simpler and more readable because we are using URL dispatch to take
care of the hardcoded URLs at the top of the tree, and we are using traversal care of the hardcoded URLs at the top of the tree, and we are using traversal
only for the arbitrarily nested subdirectories. only for the arbitrarily nested subdirectories.


See Also
~~~~~~~~

- :doc:`traversal_in_views`
78 changes: 78 additions & 0 deletions traversal_in_views.rst
@@ -0,0 +1,78 @@
Using Traversal in Pyramid Views
=================================

A trivial example of how to use :term:`traversal` in your view code.

You may remember that a Pyramid :term:`view` is called with a
:term:`context` argument:

.. code-block:: python
def my_view(context, request):
return render_view_to_response(context, request)
When using traversal, ``context`` will be the :term:`resource` object
that was found by traversal. Configuring which resources a view
responds to can be done easily via either the ``@view.config``
decorator...

.. code-block:: python
from models import MyResource
@view_config(context=MyResource)
def my_view(context, request):
return render_view_to_response(context, request)
or via ``config.add_view``:

.. code-block:: python
from models import MyResource
config = Configurator()
config.add_view('myapp.views.my_view', context=MyResource)
Either way, any request that triggers traversal and traverses to a
``MyResource`` instance will result in calling this view with that
instance as the ``context`` argument.

Optional: Using Interfaces
--------------------------

If your resource classes implement :term:`interfaces <interface>`,
you can configure your views by interface. This is one way to decouple
view code from a specific resource implementation::


# models.py
from zope.interface import implements
from zope.interface import Interface
class IMyResource(Interface):
pass
class MyResource(object):
implements(IMyResource)
# views.py
from models import IMyResource
@view_config(context=IMyResource)
def my_view(context, request):
return render_view_to_response(context, request)


See Also
--------

- :doc:`traversal`

- The "Virginia" sample application: https://github.com/Pylons/virginia/blob/master/virginia/views.py

- ZODB and Traversal in Pyramid tutorial: http://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki/index.html#bfg-wiki-tutorial

- "Pyramid Traversal and Mongodb": http://kusut.web.id/2011/03/27/pyramid-traversal-and-mongodb/

- Resources which implement interfaces: http://readthedocs.org/docs/pyramid/en/latest/narr/resources.html#resources-which-implement-interfaces

0 comments on commit 9b9e5cf

Please sign in to comment.