NOTICE: This is a fork from https://github.com/aldryncore/webservices which is archived. This fork is only intended to keep running https://github.com/Naudit/django-simple-sso as far as we can. Feel free to generate MR (We probably accept most of them) but issues will not be fixed unless they are trivial.
Build and consume web services (aka APIs) in Python.
Features
Providers that work with Django, Flask and Twisted
Everything is signed (using itsdangerous)
Synchronous consumer (framework independant)
Asynchronous consumer (powered by Twisted)
Installation
Django (provider/consumer)
pip install webservices[django]
Flask (provider/consumer)
pip install webservices[flask]
Twisted (provider/consumer)
pip install webservices[twisted]
Synchronous consumer only
pip install webservices[consumer]
Quickstart
We’ll write an API that greets you with your name (or ‘hello world’ if not name is provided).
Provider
Django
We assume you have a setting API_KEYS which is a dictionary of public keys mapping to private 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())),
)
Your 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()
Noticed how the provider is basically the same for all three (other than get_private_key)? Neat, right?
Handling errors
To log errors (for example using raven) you can implement the report_exception method on Provider classes. This method is called whenever the provide method throws an exception. It takes no arguments.
Consumer
Synchronous
To consume that code (assuming it’s hosted on ‘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'
Asynchronous
Same as above, but async:
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()
Data Source Name
You can create consumers from Data Source Names (eg 'http://public_key:private_key@api.example.org') using the from_dsn classmethod on consumers.
Example:
consumer = SyncConsumer.from_dsn(’https://public_key:private_key@api.example.org’)
License
This code is licensed under the 3-clause BSD license, see LICENSE.txt.
Metadata
Release files for webservices.naudit 0.7.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| webservices.naudit-0.7.2.tar.gz | 14.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| webservices.naudit-0.7.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.8 kB
Release files / webservices.naudit-0.7.2.tar.gz
| Download URL | webservices.naudit-0.7.2.tar.gz |
|---|---|
| Size | 14.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
22c2d6857b6b7fb500b5260b5dd93c189abd78ceead65be5cdcc9614422f1bc9
|
|
BLAKE2b-256 checksum How to use checksums |
a138467664a506e5e307b39c830075b60dba06a52fa4670a08437733068a1043
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.9.18
|
Release files / webservices.naudit-0.7.2-py3-none-any.whl
| Download URL | webservices.naudit-0.7.2-py3-none-any.whl |
|---|---|
| Size | 9.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b5eda31770c9e4616fd0dde484460366288bcb12b5de013ac5bfd22ed63c335c
|
|
BLAKE2b-256 checksum How to use checksums |
e11a1a2b2db0c1b2344fea08d329d2317a0018372f605d7f94192f079ccd6c75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.9.18
|
Security for webservices.naudit 0.7.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.