google-app-enginepython-2.7webapp2path-parameter

How to parse path-parameter with webapp2


I am coming from a Java REST background to Python on Google App Engine's. I need some help using webapp2 with path-parameters. Below is an example of how Java would read a request. Will someone please translate the code into how python would read it with webapp2?

// URL: my_dogs/user_id/{user_id}/dog_name/{a_name}/breed/{breed}/{weight}

@Path("my_dogs/user_id/{user_id}/dog_name/{a_name}/breed/{breed}/{weight}")
public Response getMyDog(
    @PathParam("user_id") Integer id,
    @PathParam("a_name") String name,
    @PathParam("breed") String breed,
    @PathParam("weight") String weight
){

//the variables are: id, name, breed, weight.
///use them somehow

}

I have already gone over the examples on google ( https://developers.google.com/appengine/docs/python/gettingstartedpython27/usingwebapp ). But I don't know how to extend the simple

app = webapp2.WSGIApplication([('/', MainPage),
                           ('/sign', Guestbook)],
                          debug=True)

Solution

  • Have a look at URI routing in webapp2. Here you can match / route an URI and get the arguments. These keyword arguments are passed to your handler : http://webapp2.readthedocs.io/en/latest/guide/routing.html#the-url-template

    Here is a helloworld example with one argument {action} :

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import webapp2
    
    class ActionPage(webapp2.RequestHandler):
    
        def get(self, action):
    
            self.response.headers['Content-Type'] = 'text/plain'        
            self.response.out.write('Action, ' + action)
    
    class MainPage(webapp2.RequestHandler):
    
        def get(self):
    
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write('Hello, webapp2 World!')
    
    app = webapp2.WSGIApplication([
            webapp2.Route(r'/<action:(start|failed)>', handler=ActionPage),
            webapp2.Route(r'/', handler=MainPage),                    
    ], debug=True)
    

    And your app.yaml:

    application: helloworld
    version: 1
    runtime: python27
    api_version: 1
    threadsafe: false
    
    handlers:
    - url: (.*)
      script: helloworld.app
    
    libraries:
    - name: webapp2
      version: latest
    

    This works fine in the SDK when I try

    http://localhost:8080/start   # result: Action, start
    or
    http://localhost:8080         # result: Hello, webapp2 World!