spore的python实现
britne的Python项目详细描述
布兰妮是一个实现SPORE specification的模块。它基于Spyre。 此模块需要API的孢子描述。有关已知服务的一些描述可从here获得。你可以用this guide自己写。
安装
布兰妮在Python2.7和Python>;=3.2下工作。要安装模块,应使用pip或easy_install:
$> pip install britney
或
$> easy_install britney
创建客户机
基础知识
必须使用new方法创建客户端,该方法读取包含api描述的json文件或公开描述的uri。可以这样做:
import britney # from a description file client = britney.new('/path/to/api_desc.json') # from an URI client = britney.new('http://my-server/ws/api_desc.json')
基本url
如果api描述文件未指定服务的基url,则可以将其作为命名参数传递给new:
import britney client = britney.new('/path/to/api_desc.json', base_url='http://my-server/ws/api/')
中间产品
有时,服务需要凭据才能让您访问数据,甚至发送数据。您创建的客户机可以在运行时启用Middleware,也可以通过这样做来扩展其使用范围:
import britney from britney.middleware import auth client = britney.new('http://my-server/ws/api_desc.json') client.enable(auth.Basic, username='login', password='xxxxxx')
有时,您希望在某些条件下启用中间产品。另一个名为enable_if的方法可以将可调用谓词作为参数,该参数可以检查请求的环境参数:
import britney from britney.middleware import auth client = britney.new('http://my-server/ws/api_desc.json') client.enable_if(lambda request: request['payload'] != '', auth.Basic, username='login', password='xxxxxx')
使用您的客户
访问数据
发送数据
一个完整的例子
创建自己的中间件
基础知识
通过创建和启用middleware,您可以通过添加身份验证或格式化数据来控制发送请求或接收响应的方式。要创建中间件,您应该:
- inherit from ^{tt1}$
- define how to instantiate your middleware
- implement the process_request method to process the request
- implement the process_response method to process the response
下面是根据请求执行运行时的基类示例:
from britney.middleware import Middleware class Runtime(Middleware): def __init__(self, runtime_header): self.runtime_header = runtime_header def process_request(self, environ): pass def process_response(self, response): pass
处理请求
使用此方法,您可以访问请求的基本环境的所有键和值。顺便说一下,您可以添加键和值,更改它们,甚至删除它们。大多数情况下,此方法不返回数据,但如果返回requests.response对象,则进程将停止并返回此响应。结果环境数据将用于生成请求:
import datetime [...] def process_request(self, environ): self.start_time = datetime.datetime.now() environ[self.runtime_key] = 0
处理响应
使用此方法,您可以访问来自响应、更改或格式化内容的数据,甚至可以检查标题或状态:
[...] def process_response(self, reponse): request_time = datetime.datetime.now() - self.start_time response.environ[self.runtime_key] = self.request_time.seconds
使用它
创建客户机时,只应启用中间件并将appropriate命名参数传递给enable方法:
import britney from your_module.middleware import Runtime client = britney.new('http:://server.org/ws/api.json') client.enable(Runtime, runtime_key='X-Spore-Runtime')
就这些!
测试它
一个模拟中间件和一个伪造Requests响应的函数可用于测试通过伪造服务器创建的中间件。要测试运行时中间件,可以执行以下操作:
import datetime import unittest import britney from britney.middleware import utils from your_module.middleware import Runtime def test_response(request): return utils.fake_response(request, 'OK') class TestRuntime(unittest.TestCase): def setUp(self): self.fake_server = {'/test', test_response} self.client = britney.new('/path/to/api.json') self.runtime_key = 'X-Spore-Runtime' def test_runtime(self): self.client.enable(Runtime, runtime_header=self.runtime_header) self.client.enable(utils.Mock, fakes=self.fake_server, middlewares=self.client.middlewares) start = datetime.datetime.now() result = self.client.test() stop = datetime.datetime.now() self.assertIn(result.environ, self.runtime_key) self.assertAlmostEqual(result.environ[self.runtime_key], (stop - start).seconds)