Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python I';我在应用程序中使用pyAMF,但我想设置智能服务,如下所述:_Python_Pyamf - Fatal编程技术网

Python I';我在应用程序中使用pyAMF,但我想设置智能服务,如下所述:

Python I';我在应用程序中使用pyAMF,但我想设置智能服务,如下所述:,python,pyamf,Python,Pyamf,在普通应用程序中,我设置了服务 services = { 'users.login': login, 'test': router } 但我想这样做: services = [ 'users.login', 'test' ] 每个请求都会发送到路由器功能。这需要2个参数:服务名称(在本例中可以是“users.login”或“test”)和输入(即flex发送给python的对象) 然后,如果来自flex的命令(服务)名为“users.login”。我想用par

在普通应用程序中,我设置了服务

services = {
    'users.login': login,
    'test': router
}
但我想这样做:

services = [
    'users.login',
    'test'
]
每个请求都会发送到路由器功能。这需要2个参数:服务名称(在本例中可以是“users.login”或“test”)和输入(即flex发送给python的对象)
然后,如果来自flex的命令(服务)名为“users.login”。我想用params运行路由器,然后这将打开commands.users.login包中的函数login。我该怎么做?谢谢。

如果我正确理解了您的问题,为了实现这一点,您需要覆盖您正在使用的网关类上的
getServiceRequest

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
是您提供给网关构造器的函数。它接受AMF远程处理请求的字符串目标并返回匹配函数。如果返回
None
或引发异常,将向请求者返回未知服务响应

希望这能为你的需求打下基础。

昨晚解决了

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)

嘿我在用谷歌,但我知道怎么做。但它并没有像预期的那样起作用。它必须在运行时从包中导入函数。如果我请求'a.b.c.d'命令,我想从'app.controllers.a.b.c.d'包加载'd'函数并运行它。可能吗?