{ "info": { "author": "Jonas Obrist", "author_email": "UNKNOWN", "bugtrack_url": null, "classifiers": [], "description": "###########\nWebservices\n###########\n\nBuild and consume web services (aka APIs) in Python. \n\n********\nFeatures\n********\n\n* Providers that work with Django, Flask and Twisted\n* Everything is signed (using itsdangerous)\n* Synchronous consumer (framework independant)\n* Asynchronous consumer (powered by Twisted)\n\n\n************\nInstallation\n************\n\nDjango (provider/consumer)\n==========================\n\n``pip install webservices[django]``\n\n\nFlask (provider/consumer)\n=========================\n\n``pip install webservices[flask]``\n\nTwisted (provider/consumer)\n===========================\n\n``pip install webservices[twisted]``\n\nSynchronous consumer only\n=========================\n\n``pip install webservices[consumer]``\n\n\n**********\nQuickstart\n**********\n\nWe'll write an API that greets you with your name (or 'hello world' if not name\nis provided).\n\nProvider\n========\n\nDjango\n------\n\nWe assume you have a setting ``API_KEYS`` which is a dictionary of public keys\nmapping to private keys. \n\n``myapi/urls.py``::\n\n from django.conf.urls import url, patterns\n from webservices.sync import provider_for_django\n from myapi.views import HelloProvider\n\n urlpatterns = patterns('',\n url(r'hello/$', provider_for_django(HelloProvider())),\n )\n\nYour ``myapi/views.py``::\n\n from django.conf import settings\n from webservices.models import Provider\n \n class HelloProvider(Provider):\n def get_private_key(self, public_key):\n return settings.API_KEYS.get(public_key)\n \n def provide(self, data):\n name = data.get('name', 'world')\n return {'greeting': u'hello %s' % name} \n\n\nFlask\n-----\n\n\n``app.py``::\n\n from flask import Flask\n from webservices.sync import provider_for_flask\n from webservices.models import Provider\n \n app = Flask(__name__)\n \n API_KEYS = {\n 'publickey': 'privatekey', # your keys here\n }\n \n class HelloProvider(Provider):\n def get_private_key(self, public_key):\n return API_KEYS.get(public_key)\n \n def provide(self, data):\n name = data.get('name', 'world')\n return {'greeting': u'hello %s' % name}\n \n provider_for_flask(app, '/hello/', HelloProvider())\n\n\nTwisted\n-------\n\n``app.py``::\n\n from twisted.internet import reactor\n from twisted.web.server import Site\n from webservices.async import provider_for_twisted\n from webservices.models import Provider\n \n API_KEYS = {\n 'publickey': 'privatekey', # your keys here\n }\n \n class HelloProvider(Provider):\n def get_private_key(self, public_key):\n return API_KEYS.get(public_key)\n \n def provide(self, data):\n name = data.get('name', 'world')\n return {'greeting': u'hello %s' % name}\n \n resource = provider_for_twisted(HelloProvider())\n \n site = Site(resource)\n reactor.listenTCP(80, site)\n reactor.run()\n\n\nNoticed how the provider is basically the same for all three (other than\n``get_private_key``)? Neat, right?\n\n\nHandling errors\n---------------\n\nTo log errors (for example using raven) you can implement the ``report_exception`` method on ``Provider`` classes.\nThis method is called whenever the ``provide`` method throws an exception. It takes no arguments.\n\n\nConsumer\n========\n\nSynchronous\n-----------\n\nTo consume that code (assuming it's hosted on 'https://api.example.org')::\n\n from webservices.sync import SyncConsumer\n \n consumer = SyncConsumer('https://api.example.org', 'mypublickey', 'myprivatekey')\n result = consumer.consume('/hello/', {'name': 'webservices')\n print result # prints 'hello webservices'\n\n\nAsynchronous\n------------\n\nSame as above, but async::\n\n from webservices.async import TwistedConsumer\n from twisted.internet import reactor\n \n def callback(result):\n print result # prints 'hello webserivces'\n reactor.stop()\n \n consumer = TwistedConsumer('https://api.example.org', 'mypublickey', 'myprivatekey')\n deferred = consumer.consume('/hello/', {'name': 'webservices')\n deferred.addCallback(callback)\n \n reactor.run()\n\n\nData Source Name\n----------------\n\nYou can create consumers from Data Source Names (eg ``'http://public_key:private_key@api.example.org'``) using the\n``from_dsn`` classmethod on consumers.\n\nExample:\n\n consumer = SyncConsumer.from_dsn('https://public_key:private_key@api.example.org')\n\n \n*******\nLicense\n*******\n\nThis code is licensed under the 3-clause BSD license, see LICENSE.txt.\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": null, "license": "BSD License", "maintainer": null, "maintainer_email": null, "name": "webservices", "package_url": "https://pypi.org/project/webservices/", "platform": "OS Independent", "project_url": "https://pypi.org/project/webservices/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/webservices/0.7/", "requires_dist": null, "requires_python": null, "summary": "UNKNOWN", "version": "0.7" }, "last_serial": 3552929, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "df4af3f813e1da4b1eb4c3e4a2833fc7", "sha256": "f26929c1c896db7398a3f5667d9c0667551ef2aa6130a8ca82e44950f5d71b3c" }, "downloads": -1, "filename": "webservices-0.1.tar.gz", "has_sig": false, "md5_digest": "df4af3f813e1da4b1eb4c3e4a2833fc7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3950, "upload_time": "2012-06-15T16:16:13", "url": "https://files.pythonhosted.org/packages/13/93/bacb595eadc2eb1d857e81bfcfbe330c413f3c82ae51f972d4e6b82f3e18/webservices-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "7455a79ae994d3bc53dec5e2cbeef312", "sha256": "fbc9dd8bf9811707a4dd96361bb4a535c2e6b579106207309cdb6b714a6dcbb4" }, "downloads": -1, "filename": "webservices-0.2.tar.gz", "has_sig": false, "md5_digest": "7455a79ae994d3bc53dec5e2cbeef312", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4966, "upload_time": "2012-12-12T14:27:26", "url": "https://files.pythonhosted.org/packages/a2/76/941e6315a8291daf60a4c06511be77a40b7c68eb31ea6fa7cde8a9a7d5ff/webservices-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "892594f3ff8b405a75c003e1c45e4b14", "sha256": "62c2dc355f56825b302d5a7b8d74a18b49e449a9d2cf1f9aa6c9522e3a4710df" }, "downloads": -1, "filename": "webservices-0.3.tar.gz", "has_sig": false, "md5_digest": "892594f3ff8b405a75c003e1c45e4b14", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5066, "upload_time": "2013-02-06T14:55:06", "url": "https://files.pythonhosted.org/packages/57/ea/4ccdb3c24f380f69428cc8a0ef2d0b40ed41af0e5cc9867681936dcd2875/webservices-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "e2f53b5a8e69fc5bff0d04fcc4fc09b5", "sha256": "30302c2d679619c86535475c496d3356dc8c6ce4baefb4aa4674e207791601d8" }, "downloads": -1, "filename": "webservices-0.4.tar.gz", "has_sig": false, "md5_digest": "e2f53b5a8e69fc5bff0d04fcc4fc09b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5487, "upload_time": "2013-05-05T14:11:42", "url": "https://files.pythonhosted.org/packages/8c/2a/070375dbde7b5fd8a933dd87389d3f04e18584eda5ce173d31844f2ec0dd/webservices-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "630164655a0f6e095213700a4e196d7a", "sha256": "3a42eb0f10e3a10fcb2615dfa738a2810f962fa45388576bc4201c845170c14b" }, "downloads": -1, "filename": "webservices-0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "630164655a0f6e095213700a4e196d7a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7013, "upload_time": "2014-08-25T08:04:28", "url": "https://files.pythonhosted.org/packages/92/f4/6d3dea5b36f36fb887196f0ebcda55a09fb8b71e6295ce5253f7a876516a/webservices-0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9e5ed4dd392dbacacc1908b0882c3070", "sha256": "63b8507e7260d90daf0526f85469124579ad21767ed855de506ba8b95bb0b628" }, "downloads": -1, "filename": "webservices-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "9e5ed4dd392dbacacc1908b0882c3070", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 7021, "upload_time": "2014-08-25T08:05:16", "url": "https://files.pythonhosted.org/packages/85/e3/8b7816b8417bcbad0b7ca5514fb7e9c2cf5cd6e8b89d0f9b338be4a8d09f/webservices-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3d82bd0a57eee46dd69b884d00c8918c", "sha256": "555451a555d007f142254dec73b9484e07d0fd032dd6ea8ac7352d189b4baf7b" }, "downloads": -1, "filename": "webservices-0.5.tar.gz", "has_sig": false, "md5_digest": "3d82bd0a57eee46dd69b884d00c8918c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5422, "upload_time": "2014-08-25T08:02:00", "url": "https://files.pythonhosted.org/packages/ce/0d/94bb6215cfd0bb58f0267f9eb0ae6401ad8344f19111aea16f27f339790c/webservices-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "2eea851d3909161db02653b02eaec843", "sha256": "23376155b28ab226e862985e265735dd71a8b4264b00403f6cac57ac27a2c8b8" }, "downloads": -1, "filename": "webservices-0.6-py2-none-any.whl", "has_sig": false, "md5_digest": "2eea851d3909161db02653b02eaec843", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7166, "upload_time": "2015-11-24T22:20:48", "url": "https://files.pythonhosted.org/packages/f2/a9/98de3f9a103ad8ce6fd94c540292228395a93b4cd87f787bea472d6f9226/webservices-0.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "61e1c2301a2f73885a374b24e1d399ba", "sha256": "8daf8cf74b84e592dc9fadedac91914f2f360ceafe6810d172cb2dc1d8ca4aa8" }, "downloads": -1, "filename": "webservices-0.6.tar.gz", "has_sig": false, "md5_digest": "61e1c2301a2f73885a374b24e1d399ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5687, "upload_time": "2015-11-24T22:20:38", "url": "https://files.pythonhosted.org/packages/93/62/3f644c078d2cb1f49b11790f0a1a7128a266c7592c8272c10c4148afa539/webservices-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "7b0a4cbb8361f9b9368a0ead3104a635", "sha256": "c4fc3c9f1061f13efce9771005e3d4b39d78efd316d3217e78d7521c7a5e03e8" }, "downloads": -1, "filename": "webservices-0.7.tar.gz", "has_sig": false, "md5_digest": "7b0a4cbb8361f9b9368a0ead3104a635", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5774, "upload_time": "2016-05-10T15:56:23", "url": "https://files.pythonhosted.org/packages/88/97/6034701ee2c62b6b8857e62a1dc3cd0329e65f3dd798c09b1ecb1ddd92a2/webservices-0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7b0a4cbb8361f9b9368a0ead3104a635", "sha256": "c4fc3c9f1061f13efce9771005e3d4b39d78efd316d3217e78d7521c7a5e03e8" }, "downloads": -1, "filename": "webservices-0.7.tar.gz", "has_sig": false, "md5_digest": "7b0a4cbb8361f9b9368a0ead3104a635", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5774, "upload_time": "2016-05-10T15:56:23", "url": "https://files.pythonhosted.org/packages/88/97/6034701ee2c62b6b8857e62a1dc3cd0329e65f3dd798c09b1ecb1ddd92a2/webservices-0.7.tar.gz" } ] }