标签: simplexmlrpcserver

在python中使用带有SimpleXMLRPCServer的**kwargs

我有一个类,我希望使用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 xmlrpclib

13
推荐指数
1
解决办法
5471
查看次数

Python的xmlrpc非常慢:每次调用一秒钟

根据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,它的工作原理相同.

python xml-rpc simplexmlrpcserver xmlrpclib

11
推荐指数
1
解决办法
3171
查看次数

如何在xmlrpc服务器上查看回溯,而不是客户端?

我有简单的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

8
推荐指数
1
解决办法
2063
查看次数

嵌套线程SimpleXMLRPCServers时的python:httplib.CannotSendRequest

我在使用一串使用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)
  • 如果我不使用SocketServer.ThreadingMixin然后这个问题不会发生(但我需要多线程的请求,所以这没有帮助.)
  • 如果我只有一个级别的服务(即只是客户端脚本直接调用最终服务器),这不会发生.

我已经能够在下面的简单测试代码中重现该问题.有三个片段:

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)

python simplexmlrpcserver xmlrpclib httplib python-2.7

8
推荐指数
1
解决办法
5452
查看次数

使用Python SimpleXMLRPCServer的无效Unicode/XML?

当我将无效的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 unicode xml-rpc simplexmlrpcserver

7
推荐指数
1
解决办法
3919
查看次数

在 python 中关闭 SimpleXMLRPCServer 服务器

目前我正在使用 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 shutdown simplexmlrpcserver

7
推荐指数
1
解决办法
1605
查看次数

在单独的线程中运行 SimpleXMLRPCServer 并关闭

我有一个类,我希望通过 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() 不会导致线程正确停止。而且由于这里似乎没有我可以使用的任何中断或超时机制,因此我不知道如何干净地关闭服务器线程。

python multithreading simplexmlrpcserver

6
推荐指数
1
解决办法
4388
查看次数

如何将xmlrpc服务器的日志输出重定向到某个文件

我正在使用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)

python logging xml-rpc simplexmlrpcserver

5
推荐指数
1
解决办法
1593
查看次数

我想忽略证书验证,在哪里以及如何使用XMLRPC Web服务?

我正在访问一个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)

iphone xml-rpc simplexmlrpcserver

4
推荐指数
2
解决办法
2万
查看次数

如何伪造Python中的soap响应?

我正在尝试测试公司产品中的功能.我们的软件将发出如下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)

python testing soap simplexmlrpcserver web.py

4
推荐指数
1
解决办法
2787
查看次数