跳转到主要内容

未知

项目描述

使用Python构建和消费Web服务(即API)。

功能

  • 与Django、Flask和Twisted一起工作的提供者

  • 一切都是已签名的(使用itsdangerous)

  • 同步消费者(框架无关)

  • 异步消费者(由Twisted提供动力)

安装

Django(提供者/消费者)

pip install webservices[django]

Flask(提供者/消费者)

pip install webservices[flask]

Twisted(提供者/消费者)

pip install webservices[twisted]

仅同步消费者

pip install webservices[consumer]

快速入门

我们将编写一个API,它将用您的名字(如果没有提供名字,则为“hello world”)问候您。

提供者

Django

我们假设您有一个名为API_KEYS的设置,它是一个将公钥映射到私钥的字典。

myapi/urls.py:

from django.conf.urls import url, patterns
from webservices.sync import provider_for_django
from myapi.views import HelloProvider

urlpatterns = patterns('',
    url(r'hello/$', provider_for_django(HelloProvider())),
)

您的myapi/views.py

from django.conf import settings
from webservices.models import Provider

class HelloProvider(Provider):
    def get_private_key(self, public_key):
        return settings.API_KEYS.get(public_key)

    def provide(self, data):
        name = data.get('name', 'world')
        return {'greeting': u'hello %s' % name}

Flask

app.py:

from flask import Flask
from webservices.sync import provider_for_flask
from webservices.models import Provider

app = Flask(__name__)

API_KEYS = {
    'publickey': 'privatekey', # your keys here
}

class HelloProvider(Provider):
    def get_private_key(self, public_key):
        return API_KEYS.get(public_key)

    def provide(self, data):
        name = data.get('name', 'world')
        return {'greeting': u'hello %s' % name}

provider_for_flask(app, '/hello/', HelloProvider())

Twisted

app.py:

from twisted.internet import reactor
from twisted.web.server import Site
from webservices.async import provider_for_twisted
from webservices.models import Provider

API_KEYS = {
    'publickey': 'privatekey', # your keys here
}

class HelloProvider(Provider):
    def get_private_key(self, public_key):
        return API_KEYS.get(public_key)

    def provide(self, data):
        name = data.get('name', 'world')
        return {'greeting': u'hello %s' % name}

resource = provider_for_twisted(HelloProvider())

site = Site(resource)
reactor.listenTCP(80, site)
reactor.run()

您注意到提供者对于所有三个(除了get_private_key)基本上是相同的吗?不错,对吧?

处理错误

要记录错误(例如使用raven),您可以在Provider类上实现report_exception方法。每当provide方法抛出异常时,都会调用此方法。它不接受任何参数。

消费者

同步

要消费该代码(假设它托管在‘https://api.example.org’)

from webservices.sync import SyncConsumer

consumer = SyncConsumer('https://api.example.org', 'mypublickey', 'myprivatekey')
result = consumer.consume('/hello/', {'name': 'webservices')
print result # prints 'hello webservices'

异步

与上面相同,但异步

from webservices.async import TwistedConsumer
from twisted.internet import reactor

def callback(result):
    print result # prints 'hello webserivces'
    reactor.stop()

consumer = TwistedConsumer('https://api.example.org', 'mypublickey', 'myprivatekey')
deferred = consumer.consume('/hello/', {'name': 'webservices')
deferred.addCallback(callback)

reactor.run()

数据源名称

您可以使用消费者类上的 from_dsn 类方法从数据源名称(例如 'http://public_key:private_key@api.example.org')创建消费者。

示例

consumer = SyncConsumer.from_dsn(‘https://public_key:private_key@api.example.org’)

许可证

此代码根据3条款BSD许可证授权,请参阅LICENSE.txt。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

webservices-0.7.tar.gz (5.8 kB 查看散列)

上传时间

支持者