Home

Awesome

aiorest-ws logo Build Status Coverage Status

REST framework with WebSockets support

This library represents as a flexible toolkit for building Web APIs, which based on the Autobahn.ws and asyncio packages. Use the opportunities of WebSockets for communication between clients and servers, build APIs like in popular frameworks (Django REST, Flask, etc.) with enough simplicity, flexibility and transparency. Develop with a pleasure!

Features

Requirements

Optional:

License

The aiorest-ws published under BSD license. For more details read LICENSE file.

Roadmap (by priority) to releases:

v1.2:

v1.3:

v1.4:

Documentation

The latest documentation for the project is available there.

Contributing

Read CONTRIBUTING file for more information.

Getting started

Client (JavaScript)

var ws = null;
var isopen = false;

window.onload = function() {
  ws = new WebSocket("ws://127.0.0.1:8080");
  ws.onopen = function() {
    console.log("Connected!");
    isopen = true;
  };

  ws.onmessage = function(e) {
    console.log("Result: " +  e.data);
  };

  ws.onclose = function(e) {
    console.log("Connection closed.");
    ws = null;
    isopen = false;
  }
};

function sendOnStaticURL() {
  if (isopen) {
    ws.send(JSON.stringify({'method': 'GET', 'url': '/hello'}));
  } else {
    console.log("Connection not opened.")
  }
}

Client (Python)

import asyncio
import json

from autobahn.asyncio.websocket import WebSocketClientProtocol, \
    WebSocketClientFactory


class HelloClientProtocol(WebSocketClientProtocol):

    def onOpen(self):
        request = {'method': 'GET', 'url': '/hello'}
        self.sendMessage(json.dumps(request).encode('utf8'))

    def onMessage(self, payload, isBinary):
        message = payload.decode('utf8')
        print(message)


if __name__ == '__main__':
    factory = WebSocketClientFactory("ws://localhost:8080")
    factory.protocol = HelloClientProtocol

    loop = asyncio.get_event_loop()
    coro = loop.create_connection(factory, '127.0.0.1', 8080)
    loop.run_until_complete(coro)
    loop.run_forever()
    loop.close()

Server

from aiorest_ws.app import Application
from aiorest_ws.routers import SimpleRouter
from aiorest_ws.views import MethodBasedView


class HelloWorld(MethodBasedView):
    def get(self, request, *args, **kwargs):
        return "Hello, world!"


router = SimpleRouter()
router.register('/hello', HelloWorld, 'GET')


if __name__ == '__main__':
    app = Application()
    app.run(host='127.0.0.1', port=8080, router=router)

Also you can look more examples there.

Running server with SSL

Aiorest-ws framework support running server with SSL. Just append certificate and key options to the Application constructor:

# WebSockets will be available on wss://127.0.0.1:8080/api
app = Application(certificate='path/to/my.crt', key='path/to/my.key')
app.run(host='127.0.0.1', port=8080, path='api', router=router)

If you don't have any certificates and keys, but want to run the server with SSL, then generate self-signed certificate via OpenSSL:

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
openssl x509 -in server.crt -out server.pem