The Resource Tree¶
Pyramid has excellent documentation on using the resource tree, especially for traversing a URL and mapping it to a view. This will not attempt to duplicate that, but rather provide a simplified explanation specifically for security.
Root Factory¶
Resources are organized into a tree of objects that are traversed using
a path ('/foo/bar/baz'). Each resource is expected to
implement the __getitem__ method and return the next resource in the
tree. Pyramid uses a root factory which, given the current
request object, returns the root of the tree. Returning a different tree
per request is completely valid. Below are two examples of factories
that return a Resource instance as the root of the tree.
class Resource(object):
def __getitem__(self, key):
raise KeyError
class RootFactory(Resource):
def __init__(self, request):
self.request = request
def root_factory(request):
return Resource()
Traversal¶
A path is broken into its segments and used to traverse the
resource tree. For example the path '/foo/bar/baz' is split
into a 3-tuple ('foo', 'bar', 'baz'). The segments are then used
to traverse the tree via the __getitem__ methods of the successive
resources. Below is an example of a simple tree that drills down into
a corporation’s hierarchy.
class Employee(object):
pass
class Department(object):
def __getitem__(self, key):
emp = Employee()
emp.id = key
return emp
class Corporation(object):
def __getitem__(self, key):
dept = Department()
dept.id = key
return dept
class Root(object):
def __getitem__(self, key):
corp = Corporation()
corp.id = key
return corp
def root_factory(request):
return Root()
Using this setup, Pyramid will use the root_factory to create the
root which will then be used to traverse the tree. The resulting
context will be an instance of the Employee.
>>> root = root_factory(None)
>>> context = root['acme']['weapons']['coyote']
>>> context
<Employee object at ...>
If at any point an invalid key is supplied, a KeyError exception
can be raised which will end the traversal. The last valid resource in
the tree will then be used as the context. However, in our simple
example any (corporation, department, employee) combination will be
accepted.
Security¶
Traversal allows for a completely natural way to organize a hierarchy
of objects. It also happens to be the way a lot of applications think
about security and permissions. For example, if we use the
resource tree from the previous section, it looks remarkably like
a security hierarchy we might use within our site. If a user is part of a
corporation they can view the departments, but unless they are in
management they cannot create, update or destroy them. Going
further, an employee can update its own records but no one elses.
The implementations of group-level and object-level security are covered in their own sections.