pythongoogle-app-engineweb-applicationspyamf

pyAMF for GAE (Google App Engine), little help needed:


# I need this behaviour:
# 1) check if the service from flash is included in the services array
# 2) if not, return false or an error | if yes, step 3
# 3) combine the rootPath('app.controllers') with the service name('sub1.sub2.sub3.function_name')
# 4) and then get the function('function_name') from the 'app.controllers.sub1.sub2.sub3.function_name' package
# 5) then run the function the way that would be done normally by pyAMF 

from app.controllers.users.login import login
from app.controllers.users.logout import logout
from app.controllers.profiles.edit import edit as profilesEdit
from app.controllers.profiles.new import new as profilesNew
from app.controllers.invitations.invite import invite as invitationsInvite
from app.controllers.invitations.uninvite import uninvite as invitationsUninvite

def main():  
  services = {
    'users.login': login,
    'users.logout': logout,
    'profiles.edit': profilesEdit,
    'profiles.new': profilesNew,
    'invitations.invite': invitationsInvite,
    'invitations.uninvite': invitationsUninvite
  }

  gateway = WebAppGateway(services, logger=logging, debug=True)
  application = webapp.WSGIApplication([('/', Init),
                                      ('/ajax', gateway)], debug=True)
  run_wsgi_app(application)

insted of this I would like:

def main():  
  services = [
    'users.login',
    'users.logout',
    'profiles.edit',
    'profiles.new',
    'invitations.invite',
    'invitations.uninvite',
    'sub1.sub2.sub3.function_name'
  ]
  rootPath = 'app.controllers'

  gateway = WebAppGateway(services, rootPath, logger=logging, debug=True)
  application = webapp.WSGIApplication([('/', Init),
                                      ('/ajax', gateway)], debug=True)
  run_wsgi_app(application)

# and then I would extend the WebAppGateway in some way to have this behaviour:
# 1) check if the service from flash is included in the services array
# 2) if not, return false or an error | if yes, step 3
# 3) combine the rootPath('app.controllers') with the service name('sub1.sub2.sub3.function_name')
# 4) and then get the function('function_name') from the 'app.controllers.sub1.sub2.sub3.function_name' package
# 5) then run the function the way that would be done normally by pyAMF

is this possible? thanks


Solution

  • Solved last night! thanks @njoyce

    from pyamf.remoting.gateway.google import WebAppGateway
    import logging
    
    class TottysGateway(WebAppGateway):
    def __init__(self, services_available, root_path, not_found_service, logger, debug):
        # override the contructor and then call the super
        self.services_available = services_available
        self.root_path = root_path
        self.not_found_service = not_found_service
        WebAppGateway.__init__(self, {}, logger=logging, debug=True)
    
    def getServiceRequest(self, request, target):
        # override the original getServiceRequest method
        try:
            # try looking for the service in the services list
            return WebAppGateway.getServiceRequest(self, request, target)
        except:
            pass
    
        try:
            # don't know what it does but is an error for now
            service_func = self.router(target)
        except:
            if(target in self.services_available):
                # only if is an available service import it's module
                # so it doesn't access services that should be hidden
                try:
                    module_path = self.root_path + '.' + target
                    paths = target.rsplit('.')
                    func_name = paths[len(paths) - 1]
                    import_as = '_'.join(paths) + '_' + func_name
                    import_string = "from "+module_path+" import "+func_name+' as service_func'
                    exec import_string
                except:
                    service_func = False
    
        if(not service_func):
            # if is not found load the default not found service
            module_path = self.rootPath + '.' + self.not_found_service
            import_string = "from "+module_path+" import "+func_name+' as service_func'
    
        # add the service loaded above
        assign_string = "self.addService(service_func, target)"
        exec assign_string
    
        return WebAppGateway.getServiceRequest(self, request, target)