天天看點

python REST API 用戶端的 URI 生成器

進行python web開發的時候,我們往往關注的是到後端 REST API 的url路由分發:一個uri是如何映射到某個controller的。比如openstack中常用的輕量級web架構pecan,就是基于對象的路由分發。

同樣的,在進行openstack開發的時候,我們通常會需要針對運作在後端的WSGI Server上的REST API Server,寫一個python版本的用戶端lib,這個用戶端調用服務端的API接口。它需要針對多層次的REST實體,能夠靈活地生成URI,并暴露具體的操作方法。

由于REST API的特性,通路實體的URI往往又是分層級的,格式看起來都是這樣的:

對于上述這種URI,我們可以專門寫一個類,通過鍊式調用,動态生成URI。

下面我們就具體展示一下用法:

class ChainedURI:
    def __init__(self, path=''):
        self._path = path

    def __getattr__(self, item):C
        return ChainedURI('%s/%s' % (self._path, item))

    def __call__(self, index):
        return ChainedURI('%s/%s' % (self._path, index))

    def __str__(self):
        return self._path
           

然後在client中進行調用:

class Client:
    base_url = ChainedURI('v1')

    def get_clusters(self, cluster_id):
        return self._get(self.base_url.clusters)

    def get_servers(self, cluster_id):
        return self._get(self.base_url\
            .clusters(cluster_id).servers)

    def get_server(self, cluster_id, server_id):
        return self._get(self.base_url\
            .clusters(cluster_id).servers(server_id))

    def get_disks(self, cluster_id, server_id):
        return self._get(self.base_url\
            .clusters(cluster_id)\
            .servers(server_id).disks)
           

比如我們在調用cleint的get_disks方法時,會生成如下的URI:

v1/clusters/45/servers/99/disks
           

參考: 廖雪峰的python教程—定制類