Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如果配置多个soap #1

Closed
greatghoul opened this issue Aug 3, 2012 · 12 comments
Closed

如果配置多个soap #1

greatghoul opened this issue Aug 3, 2012 · 12 comments

Comments

@greatghoul
Copy link

我有两个 app ,需要分别配置不同的 soap_url 及 documentation, namespace 等
如何做到这一点呢?

配置说明

@limodou
Copy link
Owner

limodou commented Aug 3, 2012

On Fri, Aug 3, 2012 at 3:44 PM, greatghoul <
reply@reply.github.com

wrote:

我有两个 app ,需要分别配置不同的 soap_url 及 documentation, namespace 等
如何做到这一点呢?

配置说明

目前是不支持的。只能修改代码才可以实现。 一般的服务还会不同吗?

I like python!
UliPad <>: http://code.google.com/p/ulipad/
UliWeb <>: https://github.com/limodou/uliweb
My Blog: http://my.oschina.net/limodou

@greatghoul
Copy link
Author

两个业务不相同,用的场景也不同,想分成两个 soap_url
想配置成

/services/serviceA?wsdl
/services/serviceB?wsdl

如果不能独立配置的话,客户端用的话(尤其是在java里面),在场景A中可能会通过wsdl导出一堆用不上的类。

没有什么不用修改 uliweb 代码来实现的折中办法吗,只要能分成两个独立的 wsdl 就行呀。

On Fri, Aug 3, 2012 at 3:52 PM, limodou <
reply@reply.github.com

wrote:

目前是不支持的。只能修改代码才可以实现。 一般的服务还会不同吗?

Ghoul To World! - http://www.g2w.me
ScriptFan - http://scriptfan.com/

@limodou
Copy link
Owner

limodou commented Aug 3, 2012

2012/8/3 greatghoul <
reply@reply.github.com

两个业务不相同,用的场景也不同,想分成两个 soap_url
想配置成

/services/serviceA?wsdl
/services/serviceB?wsdl

如果不能独立配置的话,客户端用的话(尤其是在java里面),在场景A中可能会通过wsdl导出一堆用不上的类。

没有什么不用修改 uliweb 代码来实现的折中办法吗,只要能分成两个独立的 wsdl 就行呀。

还是要改代码,主要还是配置项目前只是其中的值可以配置,但是section本身无法配,也就是无法支持多个配置。所以要修改view函数,让view函数本身可以使用不同的配置。如果你需要我可以修改一下,把view由原来的函数改为class,这样你就可以派生新的view函数,从而可以配置。

I like python!
UliPad <>: http://code.google.com/p/ulipad/
UliWeb <>: https://github.com/limodou/uliweb
My Blog: http://my.oschina.net/limodou

@greatghoul
Copy link
Author

把view由原来的函数改为class

听起来好像会改动很大呀,会不会影响 uliweb view 本来的逻辑呀。

不过我的确有需要为不同的 app 配置独立 soap 的需求,如果 uliweb 以后会在这方面支持的话,就最好了,我先用一个 wsdl 做着。

如果修改成多 soap 支持对 uliweb 影响比较大的话,还是慎重些吧,相对于功能丰富,还是希望应用更稳定一些。

还有, service 方法的文档注释能否生成 CDATA,这样能保持换行等了,更方便阅读一些。

@limodou
Copy link
Owner

limodou commented Aug 3, 2012

2012/8/3 greatghoul <
reply@reply.github.com

把view由原来的函数改为class

听起来好像会改动很大呀,会不会影响 uliweb view 本来的逻辑呀。

不过我的确有需要为不同的 app 配置独立 soap 的需求,如果 uliweb 以后会在这方面支持的话,就最好了,我先用一个 wsdl 做着。

如果修改成多 soap 支持对 uliweb 影响比较大的话,还是慎重些吧,相对于功能丰富,还是希望应用更稳定一些。

还有, service 方法的文档注释能否生成 CDATA,这样能保持换行等了,更方便阅读一些。

这块的确有一些改动。我先试试看吧。 文档那个我看看,因为是使用pysimplesoap来做的,以前没对它的细节有所了解。

I like python!
UliPad <>: http://code.google.com/p/ulipad/
UliWeb <>: https://github.com/limodou/uliweb
My Blog: http://my.oschina.net/limodou

@greatghoul
Copy link
Author

嘿嘿,那坐等更新了。

2012/8/3 limodou <
reply@reply.github.com

这块的确有一些改动。我先试试看吧。 文档那个我看看,因为是使用pysimplesoap来做的,以前没对它的细节有所了解。

Ghoul To World! - http://www.g2w.me
ScriptFan - http://scriptfan.com/

@limodou
Copy link
Owner

limodou commented Aug 3, 2012

2012/8/3 greatghoul <
reply@reply.github.com

嘿嘿,那坐等更新了。

有一个问题是如何收集function。原来是一个soap是会装所有soap函数收集到一个全局的变量中,但是如果可以支持不同的地址的话,soap如何与不同的地址对应?还是收集到一起,但是两个地址共享?要么就是在定义时要指定收集到哪个地址上去,比如原来是:

@soap('GetName', returns={'Int':int}, args={'a':int})
def p(a):
    print a

假定有两个URL定义:

[EXPOSES]
a= '/SOAP1', 'uliweb.contrib.soap.views.SoapView.soap'
b= '/SOAP2', 'uliweb.contrib.soap.views.SoapView.soap'

上面如果绑定到b上去,则定义:

@soap('GetName', returns={'Int':int}, args={'a':int}, target='b')

这样?増加多个定义后,处理要复杂一些了。

I like python!
UliPad <>: http://code.google.com/p/ulipad/
UliWeb <>: https://github.com/limodou/uliweb
My Blog: http://my.oschina.net/limodou

@greatghoul
Copy link
Author

[DECORATORS]
soapA = 'uliweb.contrib.soap.soap'
soapB = 'uliweb.contrib.soap.soap'

ÕâÑùÓа취ʵÏÖô£¿

2012/8/3 limodou <
reply@reply.github.com

[EXPOSES]
a= '/SOAP1', 'uliweb.contrib.soap.views.SoapView.soap'
b= '/SOAP2', 'uliweb.contrib.soap.views.SoapView.soap'

Ghoul To World! - http://www.g2w.me
ScriptFan - http://scriptfan.com/

@limodou
Copy link
Owner

limodou commented Aug 3, 2012

On Fri, Aug 3, 2012 at 4:47 PM, greatghoul <
reply@reply.github.com

wrote:

[DECORATORS]
soapA = 'uliweb.contrib.soap.soap'
soapB = 'uliweb.contrib.soap.soap'

ÕâÑùÓа취ʵÏÖô£¿

但是decorator soap如何识别?它不会去继承。soap服务是由两部分构成的:

  1. decorator 它是用来采集url的,上面的定义其实还是一个函数,本身它是区分不出来的,除非定义新的函数
    2.
    后台对应的View的处理,它用来处理指定url上的函数。它也要区分不同的url上来的请求,并且去查找不同的decorator(或指定了不同的容器)的soap函数。

所以decorator和view的处理要能够对应起来才可以。不然会乱掉。

I like python!
UliPad <>: http://code.google.com/p/ulipad/
UliWeb <>: https://github.com/limodou/uliweb
My Blog: http://my.oschina.net/limodou

@limodou
Copy link
Owner

limodou commented Aug 5, 2012

已经尝试着实现了。首先是原来的 uliweb.contrib.soap.views 中将原来的 soap 的view function 改为了 SoapView class的定义,这样就可以让用户从这个类进行继承。在这个类中会有一个 config 的类属性,它用来指定将使用哪个settings的配置名。代码为:

class SoapView(object):
    config = 'SOAP'

这样就表示,它会使用 settings 中的 SOAP 配置项。并且在通过 decorators 来关联 soap 函数时,如果在decorator 中传入 target 参数,就会和对应的 view class 匹配。

下面举一个例子,为了实现除了用原来的 SoapView 的处理之外,再定义新的 soap 处理,同时可以使用不同的URL路径,首先定义新的 View Class:

class SoapView2(SoapView):
    config = 'SOAP2'

这样它会使用 SOAP2 的配置。然后我们就可以使用 decorators.soap 来修饰新的soap函数,并且绑定到 SOAP2 上去,如:

@decorators.soap('hello2', returns={}, args={'a':str}, target='SOAP2')
def hello2(a):
    """
    This function is bound to SOAP2
    """
    return

然后我们再看一下settings的定义:

[EXPOSES]
soap2 = '/SOAP2', 'soap_test.views.SoapView2.soap'

[SOAP2]
namespace = None
documentation = 'Uliweb Soap2 Service'
name = 'UliwebSoap2'
prefix = 'pys'

EXPOSES 下面的 soap2 其实没有太大的用处,它主要是为了给后面的URL定义一个唯一识别的串,这样以后的app可以覆盖它。关键是 [SOAP2] 这个要与view class中的 config 定义的一致,要特别注意。

这里我没有定义 SOAP ,因为它是缺省定义,如果你要修改的话可以去覆盖它。

客户端的示例很简单,我使用suds,因为发现pysimplepy自带的好象有问题。对于不同的地址,我们要创建不同的client,如要访问 SOAP2hello2 函数,代码如下:

from suds.client import Client
client2 = Client('http://localhost:8000/SOAP2?wsdl')
result = client2.service.hello2('limodou')
print 'test hello2:', result

上面的代码示例可以从 https://github.com/limodou/uliweb-doc 中的 projects/soap_test 找到。文档还没合进去,回头找个机会合一下。你可以先试试,看还有没有问题。

@greatghoul
Copy link
Author

更新的真快,我周一去公司的时候试着配置下。

2012/8/5 limodou <
reply@reply.github.com

已经尝试着实现了。首先是原来的 uliweb.contrib.soap.views 中将原来的 soap 的view function
改为了 SoapView class的定义,这样就可以让用户从这个类进行继承。在这个类中会有一个 config
的类属性,它用来指定将使用哪个settings的配置名。代码为:

class SoapView(object):
    config = 'SOAP'

这样就表示,它会使用 settings 中的 SOAP 配置项。并且在通过 decorators 来关联 soap
函数时,如果在decorator 中传入 target 参数,就会和对应的 view class 匹配。

下面举一个例子,为了实现除了用原来的 SoapView 的处理之外,再定义新的 soap 处理,同时可以使用不同的URL路径,首先定义新的
View Class:

class SoapView2(SoapView):
    config = 'SOAP2'

这样它会使用 SOAP2 的配置。然后我们就可以使用 decorators.soap 来修饰新的soap函数,并且绑定到 SOAP2
上去,如:

@decorators.soap('hello2', returns={}, args={'a':str}, target='SOAP2')
def hello2(a):
    """
    This function is bound to SOAP2
    """
    return

然后我们再看一下settings的定义:

[EXPOSES]
soap2 = '/SOAP2', 'soap_test.views.SoapView2.soap'

[SOAP2]
namespace = None
documentation = 'Uliweb Soap2 Service'
name = 'UliwebSoap2'
prefix = 'pys'

EXPOSES 下面的 soap2 其实没有太大的用处,它主要是为了给后面的URL定义一个唯一识别的串,这样以后的app可以覆盖它。关键是
[SOAP2] 这个要与view class中的 config 定义的一致,要特别注意。

这里我没有定义 SOAP ,因为它是缺省定义,如果你要修改的话可以去覆盖它。

客户端的示例很简单,我使用suds,因为发现pysimplepy自带的好象有问题。对于不同的地址,我们要创建不同的client,如要访问
SOAP2hello2 函数,代码如下:

from suds.client import Client
client2 = Client('http://localhost:8000/SOAP2?wsdl')
result = client2.service.hello2('limodou')
print 'test hello2:', result

上面的代码示例可以从 https://github.com/limodou/uliweb-doc 中的 projects/soap_test
找到。文档还没合进去,回头找个机会合一下。你可以先试试,看还有没有问题。


Reply to this email directly or view it on GitHub:
#1 (comment)

Ghoul To World! - http://www.g2w.me
ScriptFan - http://scriptfan.com/

@greatghoul
Copy link
Author

解决了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants