编写restful api客户端。

mawac的Python项目详细描述


https://secure.travis-ci.org/bninja/wac.png?branch=master

要为restful api编写友好的客户机,您通常会执行 以下内容:

  • 编写用于与服务器通信的http客户端命令。这些命令 执行诸如封送有效负载、转换错误、调用请求挂钩等操作。
  • 将客户端反序列化的响应转换为资源对象(即 将响应对象化)。
  • 建立查询(例如筛选、排序)以访问与某些资源匹配的资源 标准可能按特定顺序排列。

在理想情况下,客户端给用户一些近似ORM的东西。 为了你的资源。本图书馆旨在帮助您编写 客户机提供您正在使用的api符合一些基本的 期望值:

  • 正确使用http。
  • 使用uri标识资源。
  • 一致地命名嵌套资源。

安装

简单:

$ pip install wac

或者如果您愿意:

$ easy_install wac

要求

用法

我们来举个例子。这个例子的代码在example.py中。

  • 首先导入wac:

    import wac
    
  • 接下来定义客户端的版本:

    __version__ = '1.0'
    
  • 同时定义默认情况下所有Clients将使用的配置:

    default_config = wac.Config(None)
    
  • 现在请友好地定义一个更新配置的函数:

    def configure(root_url, **kwargs):
        default = kwargs.pop('default', True)
        kwargs['client_agent'] = 'example-client/' + __version__
        if 'headers' not in kwargs:
            kwargs['headers'] = {}
        kwargs['headers']['Accept-Type'] = 'application/json'
        if default:
            default_config.reset(root_url, **kwargs)
        else:
            Client.config = wac.Config(root_url, **kwargs
    
  • 现在,大的一个,定义您的Client,这是用来与之交谈的 服务器:

    class Client(wac.Client):
    
        config = default_config
    
        def _serialize(self, data):
            data = json.dumps(data, default=self._default_serialize)
            return 'application/json', data
    
        def _deserialize(self, response):
            if response.headers['Content-Type'] != 'application/json':
                raise Exception("Unsupported content-type '{}'"
                    .format(response.headers['Content-Type']))
            data = json.loads(response.content)
            return data
    
  • 然后定义基Resource

    class Resource(wac.Resource):
    
        client = Client()
        registry = wac.ResourceRegistry()
    
  • 最后是你的实际资源:

    class Playlist(Resource):
    
        uri_spec = wac.URISpec('playlists', 'guid', root='/v1')
    
    
    class Song(Resource):
    
        uri_spec = wac.URISpec('songs', 'guid')
    
  • 完成!现在你可以做这样疯狂的事情:

    import example
    
    example.configure('https://api.example.com', auth=('user', 'passwd'))
    
    q = (example.Playlist.query()
        .filter(Playlist.f.tags.contains('nuti'))
        .filter(~Playlist.f.tags.contains('sober'))
        .sort(Playlist.f.created_at.desc()))
    for playlist in q:
        song = playlist.songs.create(
            name='Flutes',
            length=1234,
            tags=['nuti', 'fluti'])
        song.length += 101
        song.save()
    

贡献

  1. 叉开它
  2. 创建您的功能分支(git checkout-b my new feature
  3. 编写代码并测试
  4. 确保所有测试仍然通过(nosetests-svx tests
  5. 提交更改(git commit-am'add some feature'
  6. 推到分支(git push origin my new feature
  7. 创建新的拉取请求

历史记录

0.14(2013-01-29)

  • pin请求版本低于1.0,直到我们使用requests>;1.0对其进行测试为止

0.12(2012-10-02)

  • 修复resourcecolection.filter。
  • 添加like和ilike过滤器。
  • 次要的PEP8/格式更改。

0.11(2012-09-11)

  • 修复配置副本。

0.10(2012-07-27)

  • Python2.6兼容性。

0.9(2012-07-25)

  • 保存序列化修复程序。

0.8(2012-07-25)

  • 分页修复。

0.7(2012-07-20)

  • 其他修复。

0.3(2012-05-28)

  • 希望你喜欢。

0.2(2012-05-01)

  • 成长的痛苦。

0.1(2012-04-01)

  • 它还活着!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Hibernate:合并并删除,而不是从数据库中删除实体对象   java如何在WebFilter中有条件地从Mono返回?   java调用mysql c3p0函数   可执行jar Java jar文件加载错误:无法找到或加载主类。类导致的错误:java。lang.ClassNotFoundException:某些东西。班   java如何减少/更改爬网后的延迟?   从其他语言(如Java、PHP、Perl、Python等)调用C/C++代码的最佳方式是什么?   java如何模拟影响对象的void返回方法   当我试图在ubuntu上启动JavaScala时,它抛出了一个异常   java如何正确输出游戏   理解java和C++背景下的JavaScript原型   oracle如何将Java函数转换为postgresql函数   多线程为什么我的java服务器程序在超时后不退出?   java如何使listView中的按钮在单击时工作?   试图将这个嵌套的java forloop转换为python,但我不知道如何转换。有没有一种方法可以像这样为循环执行if语句?   java幂函数在计算器中的应用   如何在java中滚动浏览mysql数据库   在Spring Boot应用程序的JUnit测试中,java没有符合自动连线JPA存储库要求的bean   java如何使用扩展类的JPanel对象?