pythonpyamf

I'm using pyAMF in my app, but I want to set smart service like explained here:


In a normal application i set services

services = {
    'users.login': login,
    'test': router
}

but I would like to do like this:

services = [
    'users.login',
    'test'
]

and every request goes to router function. this takes 2 params: service name (can be "users.login" or "test" in this case) and input (that is the object sent by flex to python) then if the command(service) from flex is named "users.login". I would like to run the router with the params and then this will open the function login in the commands.users.login package. How would I do that? Thanks.


Solution

  • Solved last night!

    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)