我有一个类,我希望使用pythons SimpleXMLRPCServer作为远程服务公开.服务器启动如下所示:
server = SimpleXMLRPCServer((serverSettings.LISTEN_IP,serverSettings.LISTEN_PORT))
service = Service()
server.register_instance(service)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
然后我有一个ServiceRemote类,如下所示:
def __init__(self,ip,port):
self.rpcClient = xmlrpclib.Server('http://%s:%d' %(ip,port))
def __getattr__(self, name):
# forward all calls to the rpc client
return getattr(self.rpcClient, name)
Run Code Online (Sandbox Code Playgroud)
因此,ServiceRemote对象上的所有调用都将转发到xmlrpclib.Server,然后将其转发到远程服务器.问题是服务中采用名为varargs的方法:
@useDb
def select(self, db, fields, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
@useDb装饰器包装函数,在调用之前创建db并打开它,然后在调用完成之后关闭它,然后返回结果.
当我调用这个方法时,我得到错误" call()得到一个意外的关键字参数'name'".那么,是否可以远程调用采用变量命名参数的方法?或者我是否必须为我需要的每个方法变体创建一个覆盖.
谢谢你的回复.我改变了我的代码,所以问题不再是问题.但是现在我知道这个以供将来参考,如果我确实需要实现位置参数并支持远程调用.我认为Thomas和praptaks方法的结合会很好.通过xmlrpclient将kwargs转换为客户端上的位置args,并在方法服务器上使用包装器来解压缩位置参数.
根据Python文档中的示例,我使用SimpleXMLRPCServer在Python中构建了一个xml-rpc服务器.我是在同一台机器上的Python客户端调用它.服务器功能的主体自己执行得非常快.
但我发现xmlrpc客户端性能极其缓慢,每次调用需要一秒钟.(使用xmlrpclib.)
我在网上找到的加速技术(跳过getfqdn解决方案)没有帮助.
我的连接URI是:
'http://localhost:50080'
Run Code Online (Sandbox Code Playgroud)
我在Windows 7上运行Python 2.7 x64,但对于32位Python 2.7,它的工作原理相同.
我有简单的xmlrpc服务器代码:
from SimpleXMLRPCServer import SimpleXMLRPCServer
port = 9999
def func():
print 'Hi!'
print x # error!
print 'Bye!'
if __name__ == '__main__':
server = SimpleXMLRPCServer(("localhost", port))
print "Listening on port %s..." % port
server.register_function(func)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
示例会话.
客户:
>>> import xmlrpclib
>>> p = xmlrpclib.ServerProxy('http://localhost:9999')
>>> p.func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\xmlrpclib.py", line 1199, in __call__
return self.__send(self.__name, args)
File "C:\Python26\lib\xmlrpclib.py", line 1489, in __request
verbose=self.__verbose
File "C:\Python26\lib\xmlrpclib.py", line 1253, in request
return …
Run Code Online (Sandbox Code Playgroud) python multithreading simplexmlrpcserver xmlrpclib xmlrpcclient
我在使用一串使用SocketServer.ThreadingMixin的SimpleXMLRPCServers时间歇性地收到httplib.CannotSendRequest异常.
我所说的'链'是指如下:
我有一个客户端脚本,它使用xmlrpclib来调用SimpleXMLRPCServer上的函数.反过来,该服务器调用另一个SimpleXMLRPCServer.我意识到这听起来有多复杂,但是有充分的理由选择了这种架构,我没有看到它不应该成为可能的原因.
(testclient)client_script ---calls-->
(middleserver)SimpleXMLRPCServer ---calls--->
(finalserver)SimpleXMLRPCServer --- does something
Run Code Online (Sandbox Code Playgroud)
我已经能够在下面的简单测试代码中重现该问题.有三个片段:
finalserver:
import SocketServer
import time
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass
# Create server
server = AsyncXMLRPCServer(('', 9999), SimpleXMLRPCRequestHandler)
server.register_introspection_functions()
def waste_time():
time.sleep(10)
return True
server.register_function(waste_time, 'waste_time')
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
middleserver:
import SocketServer
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import xmlrpclib
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass
# Create server
server = AsyncXMLRPCServer(('', 8888), SimpleXMLRPCRequestHandler)
server.register_introspection_functions()
s = xmlrpclib.ServerProxy('http://localhost:9999')
def call_waste():
s.waste_time()
return True …
Run Code Online (Sandbox Code Playgroud) 当我将无效的XML字符传递给Python SimpleXMLRPCServer时,我在客户端获得以下错误:
Fault: <Fault 1: "<class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 6, column 15">
Run Code Online (Sandbox Code Playgroud)
为什么?我是否必须更改SimpleXMLRPCServer库代码才能解决此问题?
这是我的XML-RPC服务器代码:
from SimpleXMLRPCServer import SimpleXMLRPCServer
import logging
logging.basicConfig(level=logging.DEBUG)
def tt(text):
return "cool"
server = SimpleXMLRPCServer(("0.0.0.0", 9000))
server.register_introspection_functions()
server.register_function(tt)
# Run the server's main loop
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
这是我的XML-RPC客户端代码:
s = xmlrpclib.ServerProxy('http://localhost:9000')
s.tt(unichr(0x8))
Run Code Online (Sandbox Code Playgroud)
在服务器端,我没有得到任何错误或回溯:
liXXXXXX.members.linode.com - - [06/Dec/2010 23:19:40] "POST /RPC2 HTTP/1.0" 200 -
Run Code Online (Sandbox Code Playgroud)
为什么服务器端没有错误?我如何诊断发生了什么?
我在客户端获得以下回溯:
/usr/lib/python2.6/xmlrpclib.pyc in __call__(self, *args)
1197 return _Method(self.__send, "%s.%s" % (self.__name, name))
1198 def __call__(self, *args):
-> 1199 return self.__send(self.__name, args)
1200
1201 …
Run Code Online (Sandbox Code Playgroud) 目前我正在使用 Python 中的 SimpleXMLRPCServer 模块编写一个应用程序。
此应用程序的基本目标是继续在服务器上运行并继续检查队列中的任何任务。如果它在队列中遇到任何新请求,则为该请求提供服务。
我正在尝试做的快照:
类 MyClass():
"""
This class will have methods which will be exposed to the clients
"""
def __init__(self):
taskQ = Queue.Queue()
def do_some_task(self):
while True:
logging.info("Checking the Queue for any Tasks..")
task = taskQ.get()
# Do some processing based on the availability of some task
Run Code Online (Sandbox Code Playgroud)
如果名称==“主要”:
server = SimpleXMLRPCServer.SimpleXMLRPCServer((socket.gethostname(), Port)
classObj = MyClass()
rpcserver.register_function(classObj.do_some_task)
rpcserver.serve_forever()
Run Code Online (Sandbox Code Playgroud)
一旦服务器启动,它就会永远留在 do_some_task 方法中的循环中,以不断检查队列中的任何任务。这就是我想要实现的目标。但现在我想优雅地关闭服务器。在这种情况下,我无法关闭服务器。
到目前为止,我已经尝试将全局标志 STOP_SERVER 用于“True”,并在 do_some_task while 循环中检查其状态以退出并停止服务器。但没有帮助。
尝试使用 SimpleXMLRPCServer 的 SHUTDOWN() …
我有一个类,我希望通过 python 中的 SimpleXMLRPCServer 进行测试。我设置单元测试的方式是创建一个新线程,然后在其中启动 SimpleXMLRPCServer。然后我跑了所有的测试,最后关机。
这是我的服务器线程:
class ServerThread(Thread):
running = True
def run(self):
self.server = #Creates and starts SimpleXMLRPCServer
while (self.running):
self.server.handle_request()
def stop(self):
self.running = False
self.server.server_close()
Run Code Online (Sandbox Code Playgroud)
问题是,如果线程已经在等待 handle_request 中的请求,那么调用 ServerThread.stop(),然后调用 Thread.stop() 和 Thread.join() 不会导致线程正确停止。而且由于这里似乎没有我可以使用的任何中断或超时机制,因此我不知道如何干净地关闭服务器线程。
我正在使用SimpleXMLRPCServer模块来创建一个rpc服务器.每当我向服务器发送任何请求时,它都会向我显示连接请求.如何将此输出重定向到某个文件,以便我可以看到稍后向服务器发出的请求.
这是我的服务器脚本
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import logging
import os
import string
from subprocess import Popen,PIPE
import xmlrpclib
# Set up logging
logging.basicConfig(level=logging.DEBUG, filename = 'RPCServer.log')
class FileOperation():
'''Class to perform file operation on the Remote machine'''
def __init__(self):
self.fh = None
self.os = os #adding built-in OS module functionality
self.string = string #adding built-in String module functionality
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
server = SimpleXMLRPCServer(("localhost", 8000), …
Run Code Online (Sandbox Code Playgroud) 我正在访问一个Web服务并在尝试连接时收到此错误(Web服务是XMLRPC,我使用wordpress xmlrpc源代码请求和处理repsonse):
错误域= NSURLErrorDomain代码= -1202"此服务器的证书无效.您可能正在连接到假装为" ** .org" 的服务器,这可能会使您的机密信息面临风险."
WebService的人说要忽略证书验证部分,所以如果有人知道怎么做,那将对我有很大的帮助.
在一些建议之后我使用了下面的NSURLConnection委托,stil同样的错误
-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试测试公司产品中的功能.我们的软件将发出如下SOAP请求:
请求标题
POST /testfunction.php HTTP/1.1
Accept: application/soap+xml, application/xml, text/xml
SOAPAction: "http://www.abc.com/testfunction#test"
Host: soap.abc.com
Content-Length: 461
Connection: Keep-Alive
Run Code Online (Sandbox Code Playgroud)
请求内容
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.abc.com/testfunction">
<SOAP-ENV:Body>
<ns1:test>
<productID>3</productID>
<productSubID>1</productSubID>
<version>1.0.1</version>
<serialNumber/>
<language>EN</language>
<daysLicensed>0</daysLicensed>
<daysLeft>0</daysLeft>
</ns1:test>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
SOAP服务应该响应:
响应标题
HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Mon, 02 May 2011 13:43:46 GMT
Content-Type: text/xml; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/5.3.3-1ubuntu9.3
Content-Length: 304
Content-encoding: gzip
Run Code Online (Sandbox Code Playgroud)
响应内容
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.abc.com/testfunction"><SOAP-ENV:Body><ns1:testResponse><result>1000</result></ns1:testResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
一开始我以为我可以在web.py中创建一个Web服务,并在有人在http://www.abc.com/testfunction上发出POST请求时返回相同的响应.
import web
url = (
'/testfunction', 'testfunction',
)
class …
Run Code Online (Sandbox Code Playgroud)