2010-07-28 2 views
1

Dans une application normale i services misJ'utilise PyAMF dans mon application, mais je veux mettre un service intelligent comme expliqué ici:

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

mais je voudrais faire comme ceci:

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

et chaque demande va à la fonction de routeur. cela prend 2 params: nom du service (peut être "users.login" ou "test" dans ce cas) et input (c'est l'objet envoyé par flex to python) alors si la commande (service) de flex est nommée "utilisateurs .s'identifier". Je voudrais lancer le routeur avec les paramètres et cela ouvrira la connexion de la fonction dans le paquet commands.users.login. Comment ferais-je cela? Merci.

Répondre

0

Résolu la nuit dernière!

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) 
2

Si je comprends bien votre question, afin d'y parvenir, vous allez devoir passer outre getServiceRequest sur la classe passerelle que vous utilisez:

from pyamf.remoting.gateway.django import DjangoGateway 
from pyamf.remoting.gateway import UnknownServiceError 


class MyGateway(DjangoGateway): 
    def __init__(self, router_func, **kwargs): 
     self.router = router_func 

     DjangoGateway.__init__(self, **kwargs) 

    def getServiceRequest(self, request, target): 
     try: 
      return DjangoGateway.getServiceRequest(self, request, target) 
     except UnknownServiceError, e: 
      pass 

     # cached service was not found, try to discover it 
     try: 
      service_func = self.router(target) 
     except: 
      # perhaps some logging here 
      service_func = None 

     if not service_func: 
      # couldn't find a service matching `target`, crap out appropriately 
      raise e 

     self.addService(service_func, target) 

     return DjangoGateway.getServiceRequest(self, request, target) 

self.router est une fonction que vous fournissez le constructeur de la passerelle. Il prend la chaîne cible de la requête AMF à distance et renvoie une fonction correspondante. Si elle renvoie None ou déclenche une exception, une réponse de service inconnue sera renvoyée au demandeur.

Espérons que cela va un peu de jeter les bases pour ce dont vous avez besoin.

+0

Hey! J'utilise le google, mais je comprends comment le faire. mais cela ne fonctionne pas comme prévu. Il doit importer la fonction du package lors de l'exécution. Dans le cas où je demande la commande 'a.b.c.d', je veux charger la fonction 'd' du paquet 'app.controllers.a.b.c.d' et l'exécuter. est-ce possible? –

+0

merci maintenant je l'ai eu le travail! –

Questions connexes