在 xmlrpc 中使用代理服务器,以前在我写的 blog 备份的小程序中的确也有,不过现在 donews 的 metaweblogapi用不了了,总是报错,以致于我已经无法使用那个小程序来备份了。今天看到一个 blog 是讲关于如何让 PyPiBrowser 来支持代理服务器的,感觉不错,但改造了一下介绍给大家。

PyPi 是 Python 的Package Index 的简写,它相当于 Perl 的CPAN是一个集中的模块,应用程序发布的地方。它提供了 xmlrpc 的服务,你可以用于查看模块信息。关于 PyPi 的 xmlrpc 的说明见这里。上面还有一些 python 代码你可以直接进行试验,不过上面的代码可没有代理服务器的设置。

PyPiBrowser 是一款使用 PyQt 开发的GUI程序,可以用来浏览 PyPi 上的信息。在没有看到上面那个 blog 之前我还以为它是通过抓网页来实现的,因为我当时不知道 PyPi 还提供了 xmlrpc 的功能。

下面的小程序是我写的一个测试程序,你可以用它来显示 UliPad 的metadata信息。

import xmlrpclib
import urllib2

class UrllibTransport(xmlrpclib.Transport):
    def __init__(self, proxy, verbose=0):
        self.proxy = proxy
        self.verbose = verbose
       
    def request(self, host, handler, request_body, verbose):
        self.verbose = verbose
        url=’http://’+host+handler
        if self.verbose:
            print "ProxyTransport URL: [%s]" % url

        request = urllib2.Request(url)
        request.add_data(request_body)
        # Note: ‘Host’ and ‘Content-Length’ are added automatically
        request.add_header("User-Agent", self.user_agent)
        request.add_header("Content-Type", "text/xml") # Important
       
        proxy_handler=urllib2.ProxyHandler({’http’:self.proxy})
        opener=urllib2.build_opener(proxy_handler)
        f=opener.open(request)
        return self.parse_response(f)
   
proxy = ‘yourproxy’
url = ‘http://cheeseshop.python.org/pypi’

import xmlrpclib

if proxy:
    server = xmlrpclib.ServerProxy(url, transport=UrllibTransport(proxy))
else:
    server = xmlrpclib.ServerProxy(url)

version = server.package_releases(‘UliPad’)[0]
meta = server.release_data(‘UliPad’, version)
for k, v in meta.items():
    print k, ‘:’, v

UrllibTransport是一个我写的类,它可以在创建对象时传入一个 proxy 参数,如:http://proxy.com:8000,而那篇文章上的却是通过设置环境变量,在代理类中无法传入,所以不方便。我改造后,这样代理服务器你在哪里设置都可以:可以直接传入,也可以设在环境变量中,只要:

proxy = os.environ['http_proxy']

就可以得到,然后再传入即可。

然后在创建xmlrpclib.Server()时根据是否有代理而选择是否设置transport参数即可。

上面最后几行是找到 UliPad 的版本信息,它是一个列表,然后再次调用返回第一个版本的metadata数据并打印出来。

注意,为了发布程序,所以有花括号都转为了全角。因此如果你直接拷贝代码请转换回来。因为donews不认。


评论

该日志第一篇评论

发表评论

评论也有版权!