2010-07-28 6 views
1

를 일반 응용 프로그램에서 나는 서비스 내 응용 프로그램에서 pyAMF을 사용하고 있지만, 여기에서 설명하는 것처럼 스마트 서비스를 설정하려면 :

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

을 설정하지만 이렇게 할 싶습니다

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

그리고 모든 요청은 라우터 기능으로 이동합니다. 여기에는 서비스 이름 (이 경우 "users.login"또는 "test"가 될 수 있음)과 입력 (즉, flex에 의해 Python으로 전송 된 객체) 인 의 두 가지 매개 변수가 사용됩니다. 그러면 flex의 명령 (service) .로그인". params를 사용하여 라우터를 실행하고 싶다면 commands.users.login 패키지에 로그인 기능이 열립니다. 내가 어떻게 그럴 수 있니? 감사.

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은 당신이 제공하는 기능입니다 : 내가 이것을 달성하기 위해, 제대로 질문을 이해한다면

답변

0

해결 된 어제 밤!

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

, 당신은 당신이 사용되는 게이트웨이 클래스에 getServiceRequest를 재정의 할 필요가 있기 위하여려고하고있다 게이트웨이의 생성자. AMF Remoting 요청의 문자열 대상을 사용하고 일치하는 함수를 반환합니다. None을 리턴하거나 예외가 발생하면 알 수없는 서비스 응답이 요청자에게 리턴됩니다.

희망 사항에 따라 필요한 사항을 토대로하는 것이 좋습니다.

+0

안녕하세요! 나는 구글을 사용하고있다. 그러나 나는 그것을하는 방법 주위에 그것을 얻는다. 그러나 예상대로 작동하지 않습니다. 런타임시 패키지에서 함수를 가져와야합니다. 'a.b.c.d'명령을 요청하는 경우 'app.controllers.a.b.c.d'패키지에서 'd'기능을로드하고 실행하고 싶습니다. 그게 가능하니? –

+0

감사합니다 지금 나는 그것을 작동하게했다! –