Hi all,

Just thought I'd share my solution (work-in-progress) to enabling CORS 
<http://www.w3.org/TR/cors/> REST access to a resource setup in TurboGears 
using the EasyCrudRestController.

... I started with the recipe from the CookBook tutorial on rapid REST API 
prototyping 
<http://turbogears.readthedocs.org/en/latest/cookbook/Crud/restapi.html>. 
The relevant changes are highlighted in bold below:

The TG controller:

# -*- coding: utf-8 -*-
"""MenuEntry REST API controller module""" 

# turbogears imports 
from tg import expose, response 

# project specific imports 
from menumanagerapi.lib.base import BaseController 
from tgext.crud import EasyCrudRestController 
from menumanagerapi.model import DBSession, metadata, MenuEntry 

class MenuEntriesController(EasyCrudRestController): 
    pagination = False
    model = MenuEntry 

    







*def _after(self, *args, **kw):         
response.headerlist.append(('Access-Control-Allow-Origin', '*'))         
response.headerlist.append(('Access-Control-Allow-Methods', 'GET, POST, 
PUT, DELETE'))         
response.headerlist.append(('Access-Control-Allow-Headers', 
'Content-Type'))     @expose('json')     def options(self, menuEntryId, 
*args, **kw):         menuEntry = 
DBSession.query(MenuEntry).get(menuEntryId)         return dict(value = 
menuEntry)*


In Angular:
menuManagerApp.factory('MenuEntries', ['$resource', function($resource) {
  return $resource('http://localhost:8080/menuentry/:id.json', {'id': '@id'
}, {
        query: {
          method: 'GET',
          isArray: true,
          transformResponse: function (data) {
            var data = angular.fromJson(data);
            return data.value_list;
          }
        },
        save: {
          method: 'POST',
          transformResponse: function(data) {
            var data = angular.fromJson(data);
            return data.value;
          }
        },
*        update*





*: {          method: 'PUT',          transformResponse: function(data) {  
          var data = angular.fromJson(data);            return data.value;  
        }        }*
     });
}]);


... currently only testes running on my local machine from two different 
servers (Angular app running from Apache at localhost and the TurboGears 
app running on localhost:8080), but so far listing, deleting and updating 
are working with no problems.

Maybe this is something that could be rolled into the 
EasyCrudRestController by default?

I'm not sure whether the options method in the controller actually *has* to 
return the data item, but returning an empty dictionary resulted in an 
error. I'll try and work out a cleaner solution to this soon (maybe 
re-using the get_one, or finding out what the minimal set of data is that I 
need to return ...).

Cheers,
C

-- 
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/turbogears.
For more options, visit https://groups.google.com/d/optout.

Reply via email to