jQuery Autocompletar con fuente JSON remota + Google App Engine + Python

Digamos que tengo una aplicación web que simplemente permite a los usuarios guardar sus pasatiempos. Entonces tengo un tipo como este:

class Hobby(ndb.Model):
    hobby_name = ndb.StringProperty()

Los usuarios solo crean entidades Hobby usando este formulario:

<form action="/new-hobby" method="post">
    <input type="text" name="hobby_name" id="new-hobby" />
    <input type="submit" value="Save New Hobby" />
</form>

Entonces este formulario es manejado por esto:

# Handles /new-hobby
class NewHobby(webapp2.RequestHandler):

    def post(self):
        hobby_name = self.request.get('hobby_name')
        if hobby_name:
            h = Hobby(hobby_name = hobby)
            h.put()

app = webapp2.WSGIApplication([
    ('/new-hobby/?', NewHobby)
], debug=True)

Esto es algo estándar. Con esta configuración, se puede ver a los usuarios entrando en el mismo pasatiempo de muchas maneras (por ejemplo: "baloncesto" se puede ingresar en "baloncesto"). Aquí es donde una funcionalidad de autocompletar sería útil al aumentar la entrada "uniforme" de todos los usuarios.

Así que decidí usar el widget de autocompletado remoto de selección múltiple de Jquery (http://jqueryui.com/autocomplete/#multiple-remote):

 <script>
  $(function() {
    function split( val ) {
      return val.split( /,\s*/ );
    }
    function extractLast( term ) {
      return split( term ).pop();
    }

    $( "#birds" )
      .bind( "keydown", function( event ) {
        if ( event.keyCode === $.ui.keyCode.TAB &&
            $( this ).autocomplete( "instance" ).menu.active ) {
          event.preventDefault();
        }
      })
      .autocomplete({
        source: function( request, response ) {
          $.getJSON( "search.php", {
            term: extractLast( request.term )
          }, response );
        },
        search: function() {
          var term = extractLast( this.value );
          if ( term.length < 2 ) {
            return false;
          }
        },
        focus: function() {
          return false;
        },
        select: function( event, ui ) {
          var terms = split( this.value );
          terms.pop();
          // add the selected item
          terms.push( ui.item.value );
          terms.push( "" );
          this.value = terms.join( ", " );
          return false;
        }
      });
  });
  </script>

La fuente remota se especifica arriba del código en la línea$.getJSON( "search.php",...);.

Asumiendo que estoy en el camino correcto, la pregunta es: ¿qué archivo reemplazo?search.php con, y que debería estar dentro de ese archivo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta