WSGI middleware for OpenStack API controllers.
APIMapper
(controller_scan=<function controller_scan>, directory=None, always_scan=False, register=True, explicit=True)¶Bases: routes.mapper.Mapper
connect
(*args, **kwargs)¶Create and connect a new Route to the Mapper.
Usage:
m = Mapper()
m.connect(':controller/:action/:id')
m.connect('date/:year/:month/:day', controller="blog",
action="view")
m.connect('archives/:page', controller="blog", action="by_page",
requirements = { 'page':'\d{1,2}' })
m.connect('category_list', 'archives/category/:section',
controller='blog', action='category',
section='home', type='list')
m.connect('home', '', controller='blog', action='view',
section='home')
routematch
(url=None, environ=None)¶Match a URL against against one of the routes contained.
Will return None if no valid match is found, otherwise a result dict and a route object is returned.
resultdict, route_obj = m.match('/joe/sixpack')
APIRouter
(ext_mgr=None)¶Bases: oslo_service.wsgi.Router
Routes requests on the API to the appropriate controller and method.
ExtensionManager
= None¶factory
(global_config, **local_config)¶Simple paste factory, cinder.wsgi.Router
doesn’t have.
ProjectMapper
(controller_scan=<function controller_scan>, directory=None, always_scan=False, register=True, explicit=True)¶Bases: cinder.api.openstack.APIMapper
resource
(member_name, collection_name, **kwargs)¶Generate routes for a controller resource
The member_name name should be the appropriate singular version of the resource given your locale and used with members of the collection. The collection_name name will be used to refer to the resource collection methods and should be a plural version of the member_name argument. By default, the member_name name will also be assumed to map to a controller you create.
The concept of a web resource maps somewhat directly to ‘CRUD’ operations. The overlying things to keep in mind is that mapping a resource is about handling creating, viewing, and editing that resource.
All keyword arguments are optional.
controller
collection
Additional action mappings used to manipulate/view the entire set of resources provided by the controller.
Example:
map.resource('message', 'messages', collection={'rss':'GET'})
# GET /message/rss (maps to the rss action)
# also adds named route "rss_message"
member
Additional action mappings used to access an individual ‘member’ of this controllers resources.
Example:
map.resource('message', 'messages', member={'mark':'POST'})
# POST /message/1/mark (maps to the mark action)
# also adds named route "mark_message"
new
Action mappings that involve dealing with a new member in the controller resources.
Example:
map.resource('message', 'messages', new={'preview':'POST'})
# POST /message/new/preview (maps to the preview action)
# also adds a url named "preview_new_message"
path_prefix
name_prefix
Perpends the route names that are generated with the name_prefix given. Combined with the path_prefix option, it’s easy to generate route names and paths that represent resources that are in relations.
Example:
map.resource('message', 'messages', controller='categories',
path_prefix='/category/:category_id',
name_prefix="category_")
# GET /category/7/message/1
# has named route "category_message"
requirements
A dictionary that restricts the matching of a variable. Can be used when matching variables with path_prefix.
Example:
map.resource('message', 'messages', path_prefix='{project_id}/', requirements={"project_id": R"\d+"}) # POST /01234/message # success, project_id is set to "01234" # POST /foo/message # 404 not found, won't be matched by this route
parent_resource
A dict
containing information about the parent
resource, for creating a nested resource. It should contain
the member_name
and collection_name
of the parent
resource. This dict
will
be available via the associated Route
object which can
be accessed during a request via
request.environ['routes.route']
If parent_resource
is supplied and path_prefix
isn’t, path_prefix
will be generated from
parent_resource
as
“<parent collection name>/:<parent member name>_id”.
If parent_resource
is supplied and name_prefix
isn’t, name_prefix
will be generated from
parent_resource
as “<parent member name>_”.
Example:
>>> from routes.util import url_for
>>> m = Mapper()
>>> m.resource('location', 'locations',
... parent_resource=dict(member_name='region',
... collection_name='regions'))
>>> # path_prefix is "regions/:region_id"
>>> # name prefix is "region_"
>>> url_for('region_locations', region_id=13)
'/regions/13/locations'
>>> url_for('region_new_location', region_id=13)
'/regions/13/locations/new'
>>> url_for('region_location', region_id=13, id=60)
'/regions/13/locations/60'
>>> url_for('region_edit_location', region_id=13, id=60)
'/regions/13/locations/60/edit'
Overriding generated path_prefix
:
>>> m = Mapper()
>>> m.resource('location', 'locations',
... parent_resource=dict(member_name='region',
... collection_name='regions'),
... path_prefix='areas/:area_id')
>>> # name prefix is "region_"
>>> url_for('region_locations', area_id=51)
'/areas/51/locations'
Overriding generated name_prefix
:
>>> m = Mapper()
>>> m.resource('location', 'locations',
... parent_resource=dict(member_name='region',
... collection_name='regions'),
... name_prefix='')
>>> # path_prefix is "regions/:region_id"
>>> url_for('locations', region_id=51)
'/regions/51/locations'
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.