这里把我在google app engine中如何实现xml-rpc的处理描述一下:

import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

def version():
    return ‘3.9′

class XMLRPC(webapp.RequestHandler):
    def post(self):
        import xmlrpclib
        p, m = xmlrpclib.loads(self.request.body)
        try:
            f = globals().get(m)
            if f and callable(f):
                result = f(*p)
                xml = xmlrpclib.dumps((result,), methodresponse=1)
            else:
                xml = xmlrpclib.dumps(xmlrpclib.Fault(-32400, ’system error: Cannot find or call %s’ % m), methodresponse=1)
        except Exception, e:
            xml = xmlrpclib.dumps(xmlrpclib.Fault(-32400, ’system error: %s’ % e), methodresponse=1)
        self.response.headers['Content-Type'] = ‘text/xml; charset=utf-8′
        self.response.out.write(xml)

def main():
    application = webapp.WSGIApplication(
                                       [('/XMLRPC', XMLRPC)],
                                       debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
    main()

类XMLRPC对应/XMLRPC这个url。我的app的地址是: http://ulipad.appspot.com 因此你可以使用 http://ulipad.appspot.com/XMLRPC 来访问XMLRPC类。在XMLRPC类中定义了post方法,xml-rpc要求所有的请求都使用POST方法来传输。这个函数的处理还是挺简单的,首先要得到上传的xml报文,通过self.request.body_file.read()来得到。然后使用xmlrpclib的loads()方法得到对应的参数和方法名。然后在当前的作用域globals()中查找是否存在指定的函数(这块你可以按照需要自行修改),找到后进行执行。然后将结果再以xmlrpc的格式返回,通过使用xmlrpclib.dumps()来转换结果。

app.yaml中配置为:

- url: /XMLRPC
  script: handler_xmlrpc.py

这里文件名为handler_xmlrpc.py.

update: 2008/04/18

修改 self.request.body_file.read() 为 self.request.body


6条评论

  1. 请教问题:

    我想在windows下用python采用ssh方式访问一台主机,

    由于pexpect只有unix版本,打算用pyssh,但是可能是版本低的原因,报错,显示pyssh包初始化的时候会用到:

    self.old_handler = signal.getsignal(signal.SIGCHLD) 而signal.SIGCHLD在我的python 2.5.1中没有,请问还有什么包可以用。谢谢。

  2. singal在windows下是有限制的。不过我没有做过ssh的东西,无法回答你。

  3. li哥 看了你的python tip后我硬写了个函数你看对不

    #如何判断一个字符串只包含数字字符

    def checknonumber(str):

    sum = 0

    length = len(str)

    for x in str:

    sum = sum + ord(x)

    if sum <= length*57 and sum >= length*48:

    return True

    return False

  4. 这个你试一下就行了。与是不是xml-rpc无关。另外字符串对象本身有判断是否全为数字的方法:

    >>> a=’a’

    >>> a.isdigit()

    False

    >>> a=’1′

    >>> a.isdigit()

    True

  5. 谢谢,正需要。

  6. Roboter’s blog ?? python??????????????????

发表评论

评论也有版权!