spore的python实现

britne的Python项目详细描述


布兰妮是一个实现SPORE specification的模块。它基于Spyre。 此模块需要API的孢子描述。有关已知服务的一些描述可从here获得。你可以用this guide自己写。

https://secure.travis-ci.org/agrausem/britney.png?branch=masterhttps://coveralls.io/repos/agrausem/britney/badge.png?branch=masterhttps://img.shields.io/pypi/v/britney.svghttps://img.shields.io/pypi/dm/britney.svgCode HealthPython Versionhttps://img.shields.io/pypi/format/britney.svg

安装

布兰妮在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)

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

推荐PyPI第三方库


热门话题
使用JavaCV库进行图像旋转的java问题   为Java类创建相等的方法来比较double或int值   javarmi、EJB和回调   用java编写phonegap应用程序(使用GWT、Vaadin等)   java在Hibernate中设置参数值时指定字符串类型   java正则表达式文本日期   Java Hibernate@SafeHtml不允许url链接   使用Java Trie时,无法识别词尾。在递归中失败   java如何在Swing的JTextArea中执行正则表达式   java如何在列表的所有对象中更改sepecific属性的值   java为什么是我的ArrayList。删除(id)呼叫不工作?   java是否可以将用户从同一个jcombobox输入的项添加到jcombobox中?   java当从Python调用jar时,如何最小化JavaVM的加载时间?   面向对象Java类如何从Entry类获取信息?   java JPA错误:关系不存在