Generate the route url for a Cornice service or resource

As far as I can tell, there’s no documentation on how to generate the reverse url for a Cornice resource or service. Suppose I want to publish a list of children resources and i want to make them behave as linked data. For that, I want to be able to generate proper URLs, based on the request URL.

This is some sample code to show how to achieve that, based on a side project I’m working on:

@resource(collection_path="/",
          path="/{id}", cors_origins=('*',), cors_max_age=3600)
class MLModelResource(object):

    def __init__(self, request):
        self.request = request

    def _model_url(self, ml):
        return self.request.route_url(self.__class__.__name__.lower(),
                                      id=ml.name)

    def serialize_model(self, ml, sess):
        res = {}
        res['name'] = ml.name
        res['labels'] = get_model_labels(ml, sess)
        res['can_predict'] = ml.can_predict()
        res['url'] = self._model_url(ml)
        return res

    def collection_get(self):
        sess = self.request.dbsession
        res = []
        for ml in sess.query(MLModel):
            res.append(self.serialize_model(ml, sess))
        return {'models': res}

Notice this line: return self.request.route_url(self.__class__.__name__.lower(), id=ml.name) Cornice registers, for each resource, two routes: one named collection_<classname>.lower() and another one with just the lower class name, <classname>.lower().

For the regular services, Cornice register routes with the proper service name. So, for a service such as:

sampleserv = Service(name="sampleserv",
                  description="Use the sampleserv service",
                  path="/{name}/sampleserv",
                  cors_origins=('*',),
                  cors_max_age=3600)

the way to generate the route is:

self.request.route_url('sampleserv', name='something')

Comments